map
是 C++ 标准库中的一个关联容器,它存储的元素都是键值对(key-value pair),并且允许基于键(key)快速访问单个元素。在 map
中,键是唯一的,而值可以是任何数据类型。map
内部通常实现为一个平衡二叉搜索树(如红黑树),因此它允许对键进行对数时间复杂度的查找、插入和删除操作。
以下是 map
的一些基本特点和使用方法:
特点
- 键唯一性:
map
中的每个键都是唯一的,尝试插入具有相同键的新元素将替换旧元素的值。 - 自动排序:
map
中的元素默认按照键的升序排列。 - 动态大小:
map
可以动态地增长和缩小,以适应存储的元素数量。
使用方法
包含头文件
cpp复制代码
#include <map> |
创建 map
cpp复制代码
std::map<KeyType, ValueType> myMap; |
其中 KeyType
是键的类型,ValueType
是值的类型。
插入元素
cpp复制代码
myMap[key] = value; // 如果键不存在,则插入新元素;如果键存在,则更新对应的值 |
或者
cpp复制代码
myMap.insert(std::pair<KeyType, ValueType>(key, value)); |
或者使用 make_pair
函数
cpp复制代码
myMap.insert(std::make_pair(key, value)); |
访问元素
cpp复制代码
ValueType& value = myMap[key]; // 通过键访问值,如果键不存在,则插入新元素(键为默认值,值为 ValueType 的默认值) |
或者
cpp复制代码
std::map<KeyType, ValueType>::iterator it = myMap.find(key); | |
if (it != myMap.end()) { | |
ValueType& value = it->second; // 如果找到了键,则访问对应的值 | |
} else { | |
// 键不存在 | |
} |
删除元素
cpp复制代码
size_t numErased = myMap.erase(key); // 删除键为 key 的元素,返回被删除的元素数量(0 或 1) |
或者通过迭代器删除
cpp复制代码
std::map<KeyType, ValueType>::iterator it = myMap.find(key); | |
if (it != myMap.end()) { | |
myMap.erase(it); // 删除迭代器指向的元素 | |
} |
遍历元素
cpp复制代码
for (const auto& kv : myMap) { // 使用范围 for循环遍历所有元素 | |
KeyType key = kv.first; | |
ValueType value = kv.second; | |
// 处理键和值... | |
} |
或者使用迭代器
cpp复制代码
for (std::map<KeyType, ValueType>::iterator it = myMap.begin(); it != myMap.end(); ++it) { | |
KeyType key = it->first; | |
ValueType value = it->second; | |
// 处理键和值... | |
} |
注意事项
- 当使用
myMap[key]
访问元素时,如果map
中不存在该键,则会插入一个默认构造的元素。如果你只是想检查键是否存在,而不希望插入新元素,应该使用find
方法。 map
的键类型通常需要支持比较操作(如<
),以便容器能够排序和查找元素。标准库为内置类型(如int
,std::string
等)提供了比较操作,对于自定义类型,你需要定义比较函数或重载比较运算符。
通过 map
,你可以方便地存储和查找键值对,而不需要自己实现复杂的查找算法或维护排序的数据结构。