在C++中,map
是一个非常重要的STL(标准模板库)容器,它以键值对的形式存储数据,允许快速查找、插入和删除操作。以下是对 map
的详细介绍以及相关方法。
基本特性
- 有序性:
map
会根据键的大小自动排序。 - 唯一的键:每个键都是唯一的,不能有重复键。如果插入了相同的键,之前的值会被新值覆盖。
- 时间复杂度:查找、插入、删除的平均和最坏时间复杂度都是 O(log n)。
- 默认类型:
map
默认存储pair<const Key, T>
类型。
相关方法
-
构造函数
map()
: 默认构造函数,创建一个空的map。map(const Compare& comp, const Allocator& alloc = allocator() )
: 指定比较规则和分配器。
-
插入元素
-
insert()
: 插入一个键值对。myMap.insert({key, value}); myMap.insert(std::pair<keyType, valueType>(key, value));
-
使用下标操作符:
myMap[key] = value; // 如果key不存在,会插入一个新的键值对
-
-
查找元素
-
find()
: 查找键对应的值,返回一个迭代器。auto it = myMap.find(key); if (it != myMap.end()) { // 找到了 }
-
count()
: 返回特定键的个数(在map
中通常是 0 或 1)。size_t count = myMap.count(key);
-
使用下标操作符,如果键存在,返回对应的值;如果不存在,就会插入一个默认值:
T value = myMap[key]; // 注意:这可能导致插入
-
-
删除元素
-
erase()
: 根据键删除元素。myMap.erase(key);
-
可以接受迭代器来删除特定位置的元素:
myMap.erase(it); // it 是指向元素的迭代器
-
-
访问元素
at()
: 通过键访问对应的值,若键不存在则会抛出异常。T value = myMap.at(key); // 若键不存在将抛出 std::out_of_range 异常
-
其他方法
size()
: 返回元素个数。empty()
: 判断容器是否为空。clear()
: 清空所有元素。begin()
,end()
: 返回指向第一个和最后一个元素的迭代器。rbegin()
,rend()
: 反向迭代器。
遍历 map
可以使用范围基 for 循环或迭代器遍历所有元素:
for (const auto &pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// 使用迭代器
for (auto it = myMap.begin(); it != myMap.end(); ++it) {
std::cout << it->first << ": " << it->second << std::endl;
}
示例代码
以下是一个简单的示例,展示了 map
的使用:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<int, std::string> myMap;
// 插入元素
myMap[1] = "apple";
myMap[2] = "banana";
myMap.insert({3, "cherry"});
// 查找元素
auto it = myMap.find(2);
if (it != myMap.end()) {
std::cout << "Found: " << it->second << std::endl; // 输出: Found: banana
}
// 删除元素
myMap.erase(1);
// 遍历 map
for (const auto &pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
总结
map
是 C++ STL 中强大且灵活的容器,适用于许多需要高效键值对存储与访问的场景。无论是查找、插入还是删除操作,map
都能提供优异的性能表现。