天天看点

C++STL之unordered_map的简单使用简介常用函数代码运行截图 参考

目录

简介

常用函数

代码

运行截图

参考

简介

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;
}
           

运行截图

C++STL之unordered_map的简单使用简介常用函数代码运行截图 参考

插入、显示、查找

C++STL之unordered_map的简单使用简介常用函数代码运行截图 参考

删除

 参考

cplusplus-unordered_map

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

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

继续阅读