unordered_map 和 unordered_multimap 容器的内部和 map 容器一样,存储的都是键值对, 以 pair 类型存储。
- unordered_map 是无序映射容器,不会根据元素的 key 进行排序;
- unordered_map 的键值不允许修改,但是可以删除。但是,其实值是可以修改;
- unordered_map 和 unordered_set 容器一样,内部是以散列表(哈希表)数据结构来实现;
- unordered_map 和 unordered_multimap,前者不允许存储 key 相同的元素,后者是允许的
ostream& operator<<(ostream& os, const unordered_map<int, string>& m)
{
for (auto p : m) cout << p.first << " " << p.second << endl;
return os;
}
// 1. unordered_map 容器使用
void test01()
{
// 创建空的容器
unordered_map<int, string> m;
// 创建并初始化容器
// unordered_map<int, string> m = { {2, "aaa"}, {1, "bbb"}, {3, "ccc"} };
// 元素插入
m.insert(pair<int, string>(1, "aaa"));
m.insert(make_pair(2, "bbb"));
m.insert(unordered_map<int, string>::value_type(3, "ccc"));
m.emplace(4, "ddd");
m[5] = "eee"; // 能够使用下标并不能说明其是数组。
// 如果 key 存在,则修改 key 对应的 value.
m[1] = "ppp";
// 如果 key 不存在,则创建一个键值为 key 的元素,实值为其类型默认值的 pair
cout << m[6] << endl;
cout << m << endl;
}
void test02()
{
// 键值不能改, 但是实值可以改
unordered_map<int, string> m = { {2, "aaa"}, {1, "bbb"}, {3, "ccc"} };
auto it = m.begin();
// it->first = 100;
it->second = 200;
// 容器中删除元素
m.erase(m.begin());
m.erase(m.begin(), m.end());
m.erase(3);
m.clear();
}
void test03()
{
unordered_map<int, string> m = { {2, "aaa"}, {1, "bbb"}, {3, "ccc"} };
// 1. count(key) : 查找某个 key 的元素的个数
cout << m.count(2) << endl;
// 2. find(key) : 根据 key 查找某个元素,查找到返回迭代器,查找失败返回 end 迭代器
auto it = m.find(3);
if (it == m.end())
{
cout << "查找失败" << endl;
}
else
{
cout << "查找成功" << endl;
}
// 3. lower_bound(key)、upper_bound(key)、equal_range(key)
// 不支持 lower_bound(key)、upper_bound(key), 但是 equal_range 可以使用
auto ret = m.equal_range(2);
cout << ret.first->first << " " << ret.second->first << endl;
}
// 2. unordered_multimap 使用例子
void test04()
{
unordered_multimap<int, int> m = { {1, 1}, {1, 2}, {2, 3}, {2, 4} };
for (auto p : m)
cout << p.first << " " << p.second << endl;
}

冀公网安备13050302001966号