在 C++ 中,map
是一种关联容器,它存储的是键值对(key-value pairs),并且根据键(key)进行排序。map
中的键是唯一的,而值可以根据需要重复。map
内部通常使用红黑树实现,这使得插入、删除和查找操作都具有对数时间复杂度O(logn)。
1. 头文件
使用map
需要包含<map>
头文件:
#include <map>
2. 定义和初始化
- 定义一个空的
map
:
std::map<int, std::string> myMap;
这里定义了一个map
,键的类型是int
,值的类型是std::string
。
- 初始化
map
:
std::map<int, std::string> myMap = {
{1, "one"},
{2, "two"},
{3, "three"}
};
3. 常用接口
插入元素
- 使用
insert
方法:
myMap.insert(std::make_pair(4, "four"));
// 或者使用花括号初始化列表
myMap.insert({5, "five"});
- 使用
operator[]
:
myMap[6] = "six";
operator[]
在插入元素时,如果键不存在,会自动创建一个新的键值对;如果键已存在,会更新对应的值。
访问元素
- 使用
at
方法:
std::string value = myMap.at(2);
at
方法会检查键是否存在,如果不存在会抛出std::out_of_range
异常。
- 使用
operator[]
:
std::string value2 = myMap[2];
operator[]
如果键不存在,会插入一个默认值的键值对。因此,operator[]
不适合用于只读访问。
查找元素
- 使用
find
方法:
auto it = myMap.find(3);
if (it!= myMap.end()) {
std::cout << "Found key 3 with value: " << it->second << std::endl;
}
find
方法返回一个迭代器,指向找到的键值对;如果没有找到,返回map
的end()
迭代器。
删除元素
- 使用
erase
方法:
// 根据键删除
myMap.erase(4);
// 根据迭代器删除
auto it2 = myMap.find(5);
if (it2!= myMap.end()) {
myMap.erase(it2);
}
获取大小
- 使用
size
方法:
size_t mapSize = myMap.size();
检查是否为空
- 使用
empty
方法:
bool isEmpty = myMap.empty();
遍历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;
}
示例代码
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<int, std::string> myMap = {
{1, "one"},
{2, "two"},
{3, "three"}
};
// 插入元素
myMap.insert({4, "four"});
myMap[5] = "five";
// 访问元素
std::cout << "Value of key 2: " << myMap.at(2) << std::endl;
std::cout << "Value of key 3: " << myMap[3] << std::endl;
// 查找元素
auto it = myMap.find(4);
if (it!= myMap.end()) {
std::cout << "Found key 4 with value: " << it->second << std::endl;
}
// 删除元素
myMap.erase(5);
// 遍历map
std::cout << "Contents of map:" << std::endl;
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// 获取大小
std::cout << "Size of map: " << myMap.size() << std::endl;
// 检查是否为空
std::cout << "Is map empty? " << (myMap.empty()? "Yes" : "No") << std::endl;
return 0;
}