本文共 2334 字,大约阅读时间需要 7 分钟。
map和multimap是STL中常用的关联式容器,用于存储键值对。它们在数据结构和操作上与set/multiset类似,但额外提供了键值存储的功能。以下是关于map和multimap的详细说明。
map是标准的关联式容器,每个键值对由键(key)和值(value)组成。map的特点是键是唯一的,每个键只能出现一次。这使得map非常适合需要快速检索和唯一性保证的场景。
less函数。如果需要倒序存储,可以使用greater作为比较器。map的构造有两种方式:无参构造和带参构造。
map<int, string> m1; 会创建一个默认排序的map。mapm5(m1.begin(), m1.end());map m6(m3);
可以通过拷贝构造函数或赋值构造函数来初始化map。
multimap与map的主要区别在于键的唯一性。multimap允许相同的键出现多次,这使其在存储多个相同键值对时非常有用。
less函数。| 特性 | map | multimap |
|---|---|---|
| 键唯一性 | 唯一(每个键只能出现一次) | 可重复(允许多个相同键) |
| []操作符支持 | 支持(直接获取值) | 不支持 |
| 元素个数获取 | 1(如果键存在)或0(如果键不存在) | 可能大于1(如果键存在多次) |
| 适用场景 | 存储唯一的键值对 | 存储多个相同的键值对 |
可以通过以下方式插入元素到map或multimap中:
构造pair对象:
m.insert(std::make_pair(1, "张三"));
如果键已经存在,插入失败。
使用value_type:
m.insert(map::value_type(2, "李四"));
value_type是pair<int, string>,可以直接构造键值对。
直接使用[]操作符:
m[4] = "赵六";m[4] = "韩七"; // 覆盖操作
如果键不存在,插入并初始化值为默认;如果键存在,直接覆盖值。
通过迭代器可以遍历map或multimap中的元素:
auto it = m.begin();
auto it = m.end();
auto r_it = m.rbegin();auto rend = m.rend();
for (auto it = m.begin(); it != m.end(); ++it) { cout << "key: " << it->first << " value: " << it->second << endl;}map和multimap默认以键的顺序存储,可以通过指定比较器来改变排序方式:
mapm1;
map
m3.swap(m2); // 交换m3和m2的元素
m.erase(m.begin());m.erase(beg, end);m.erase(key); // 删除指定键的对组
m.clear();
m.size();
m.empty();
auto it = m.find(key);if (it != m.end()) { // 存在键,获取对应的值} else { // 键不存在}auto mit = m2.find(key);if (mit != m2.end()) { // 查找多个键值对}m.count(key);
auto lower = m.lower_bound(key);auto upper = m.upper_bound(key);auto range = m.equal_range(key);
equal_range 返回的是一个pair<iterator, iterator>,分别表示范围的起始和结束。
map和multimap是STL中非常实用的容器。map适合存储唯一的键值对,而multimap适合存储多个相同的键值对。无论是map还是multimap,它们都支持高效的插入、删除、查找操作,并提供丰富的迭代器功能。通过合理选择比较器和操作方式,可以实现各种复杂的数据管理需求。
转载地址:http://hrpjz.baihongyu.com/