1. 理解map与multimap的核心差异
在C++标准模板库(STL)中,map和multimap都是基于红黑树实现的关联容器,但它们的核心区别在于键(key)的唯一性。map要求所有键必须唯一,而multimap允许重复键存在。这种差异直接影响了它们的接口设计和典型应用场景。
1.1 键唯一性带来的接口差异
map提供了operator[]和at()这样的直接访问接口,因为每个键都唯一对应一个值。例如:
cpp复制std::map<int, string> m;
m[1] = "Apple"; // 合法操作
而multimap由于允许键重复,无法确定operator[]应该返回哪个值,因此不提供这些接口。访问元素必须通过迭代器:
cpp复制std::multimap<int, string> mm;
mm.insert({1, "Apple"});
// mm[1] = "Banana"; // 编译错误!
1.2 内部实现与性能特征
两者底层都采用红黑树结构,保证了元素始终按键排序。插入、删除和查找操作的时间复杂度均为O(log n)。但由于multimap需要处理重复键,其equal_range()等操作的实际性能会略低于map的对应操作。
提示:当需要频繁按键范围查询时,multimap的性能优势才会真正显现,因为它可以一次性获取所有相同键的元素。
2. map的完整使用方法详解
2.1 初始化与元素插入
map支持多种初始化方式:
cpp复制// 空map
std::map<string, int> m1;
// 初始化列表
std::map<string, int> m2 = {
{"Apple", 5},
{"Banana", 3}
};
// 插入元素
m1.insert({"Orange", 2}); // 使用insert
m1["Pear"] = 4; // 使用operator[]
注意operator[]的行为特性:
- 若键存在,返回对应值的引用
- 若键不存在,先插入默认构造的值,再返回引用
- 因此m[k]++这样的操作总是安全的
2.2 元素访问与修改
安全的元素访问方式
