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