目录
简介
常用函数
代码
运行截图
参考
简介
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;
}
运行截图
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9E1T5Z1RiNHbyEmZshkWohnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zROBlL1QzN3UjM0UTMxMDOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
插入、显示、查找
删除
参考
cplusplus-unordered_map
更多STL例子:C++ STL的使用
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。