editor shell pdf d3 网络营销推广 Font Awesome vue过滤器 vue部署 vue样式 webpack视频 pmp视频教程下载 matlab中log函数 oracle查看数据库状态 matlab四舍五入 python中time python中的join函数 python环境变量配置 java队列 java新特性 java8的新特性 java中的基本数据类型 java方法 java日期函数 java的输入 php实例代码 魔之符咒 Ext2Fsd js删除数组指定元素 linux解压tar 华为线刷工具 渐变事件 御旌是什么 qq免安装 识别音乐的软件 地下城怎么双开 jarsigner 还原软件哪个好 网卡驱动安装包 babelrc ps去白底
当前位置: 首页 > 学习教程  > 编程语言

C++STL之unordered_map的简单使用

2020/8/31 15:48:24 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

目录

简介

常用函数

代码

运行截图

参考


简介

unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不允许被修改。unordered_map 容器底层采用的是哈希表存储结构,该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。unordered_map容器通过其键值访问单个元素的速度要比map容器快。

常用函数

常用成员函数 功能
iterator begin() noexcept 返回指向容器中第一个键值对的正向迭代器。
iterator end() noexcept 返回指向容器中最后一个键值对之后位置的正向迭代器。
bool empty() const noexcept 若容器为空,则返回 true;否则 false。
size_type size() const noexcept 返回当前容器中存有键值对的个数。
mapped_type& operator[] ( key_type&& k ) 该模板类中重载了 [] 运算符,其功能是可以向访问数组中元素那样,只要给定某个键值对的键 key,就可以获取该键对应的值。注意,如果当前容器中没有以 key 为键的键值对,则其会使用该键向当前容器中插入一个新键值对。
mapped_type& at ( const key_type& k ) 返回容器中存储的键 key 对应的值,如果 key 不存在,则会抛出 out_of_range 异常。 
iterator find ( const key_type& k ) 查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。
size_type count ( const key_type& k ) const 在容器中查找以 key 键的键值对的个数。
pair<iterator,iterator> equal_range ( const key_type& k ) 返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中键为 key 的键值对所在的范围。
template <class... Args>
pair<iterator, bool> emplace ( Args&&... args )
向容器中添加新键值对,效率比 insert() 方法
template <class... Args>
iterator emplace_hint ( const_iterator position, Args&&... args )
向容器中添加新键值对,效率比 insert() 方法
pair<iterator,bool> insert ( const value_type& val ) 向容器中添加新键值对。建议使用emplace()代替。
iterator insert ( const_iterator hint, const value_type& val ) 根据正向迭代器hint的位置进行val值的插入。
template <class InputIterator>
    void insert ( InputIterator first, InputIterator last )
指定元素范围的迭代器。范围为[first,last)的元素的副本将插入到unordered_map容器中。模板类型可以是任何类型的输入迭代器。
void insert ( initializer_list<value_type> il ) il,一个initializer_list对象。编译器将根据初始化列表声明器自动构造此类对象。成员类型value_type是容器中包含的元素的类型,在unordered_map中定义为pair <const key_type,mapped_type>,其中成员类型key_type是第一个模板参数的别名(键类型),而mapped_type是第一个模板参数的别名。第二个模板参数(映射类型T)
iterator erase ( const_iterator position ) position,指向要从unordered_map中删除的单个元素的迭代器。成员类型const_iterator是正向迭代器类型。
size_type erase ( const key_type& k ) k,要删除的元素的键。成员类型key_type是容器中元素的键的类型,在unordered_map中定义为其第一个模板参数(Key)的别名。
iterator erase ( const_iterator first, const_iterator last )

迭代器在unordered_map容器中指定要删除的范围:[first,last)。
请注意,unordered_map容器不遵循任何特定顺序来组织其元素,因此范围删除的效果可能不容易预测。成员类型const_iterator是正向迭代器类型。尽量不用这个函数。

void clear() noexcept 清空容器,即删除容器中存储的所有键值对。
void swap ( unordered_map& ump ) 交换 2 个 unordered_map 容器存储的键值对,前提是必须保证这 2 个容器的类型完全相等。

代码

/*
Project:unordered_map
Date:    2020/08/31
Author:  Frank Yu
*/
#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;
unordered_map<string, float> m;
unordered_map<string, float>::iterator it;
//菜单
void menu()
{
	cout << "******1.插入		2.删除******" << endl;
	cout << "******3.查找		4.显示******" << endl;
	cout << "******5.退出					" << endl;
}
//插入
void Insert()
{
	int i, n; string s; float f;
	cout << "请输入同学人数:" << endl;
	cin >> n;
	cout << "请依次输入" << n << "位同学的姓名(不可重复)及成绩:" << endl;
	for (i = 0; i<n; i++)
	{
		cin >> s >> f;
		m.emplace(s, f);
	}
}
//删除
void Delete()
{
	int i, place, flag;
	string ss;
	cout << "******1.删除某个同学信息 2.删除某位置的同学信息******" << endl;
	cout << "******3.全部删除                               ******" << endl;
	cin >> i;
	switch (i)
	{
		case 1: {
			cout << "请输入该同学的名字:" << endl;
			cin >> ss;
			flag = m.erase(ss);
			if (flag == NULL)cout << "没有这位同学,删除失败。" << endl;
			else cout << "删除成功!" << endl;
		}break;
		case 2: {
			cout << "请输入位置(首元素位置为0):" << endl;
			cin >> place;
			if (place<0 || place>m.size())cout << "位置不在范围内。" << endl;
			else
			{
				it = m.begin();
				while (place--)it++;
				ss = (*it).first;
				m.erase(ss);
				cout << "删除成功!" << endl;
			}
		}break;
		case 3:m.clear(); break;
		default:cout << "输入错误!" << endl;
	}

}
//查找
void Find()
{
	string name;
	cout << "请输入同学的名字:" << endl;
	cin >> name;
	it = m.find(name);
	if (it != m.end())
	{
		cout << it->first << ":" << it->second << endl;
	}
	else cout << "没有这位同学。" << endl;
}
void Display()
{
	cout << "学生及成绩如下:" << endl;
	for (auto it = m.begin();it!=m.end();it++)
	{
		cout << it->first << ":" << it->second<<endl;
	}
}
//主函数
int main()
{
	int i;
	while (1)
	{
		menu();
		cout << "请输入菜单号:" << endl;
		cin >> i;
		if (i == 5)break;
		switch (i)
		{
		case 1:Insert(); break;
		case 2:Delete(); break;
		case 3:Find(); break;
		case 4:Display(); break;
		default:cout << "输入错误!" << endl;
		}
	}
	return 0;
}

运行截图

插入、显示、查找
删除

 参考

cplusplus-unordered_map

更多STL例子:C++ STL的使用

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。


本文链接: http://www.dtmao.cc/news_show_150426.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?