std::map 是 C++ 标准库中的一个关联容器,它包含可以重复的键值对(在 std::map 中键是唯一的),并允许基于键的快速查找。下面是对 std::map 的详细用法介绍。
1. 引入头文件
要使用 std::map,首先需要包含 <map> 头文件。
#include <map>
2. 声明 map
std::map 的声明需要指定键和值的类型。例如,一个存储整数键和字符串值的 map 可以这样声明:
std::map<int, std::string> my_map;
3. 插入元素
可以通过多种方式向 map 中插入元素:
使用 insert 函数:
my_map.insert(std::make_pair(1, "one"));
或者使用 C++11 后的初始化列表:
my_map.insert({2, "two"});
使用 [] 运算符(如果键不存在,则插入;如果键存在,则覆盖值):
my_map[3] = "three";
4. 访问元素
可以使用 [] 运算符或 at 函数来访问元素。但是,如果键不存在,at 函数会抛出 std::out_of_range 异常,而 [] 运算符会插入一个具有该键的新元素。
std::string value = my_map[1]; // 如果键 1 不存在,则插入一个新元素
std::string value2 = my_map.at(2); // 如果键 2 不存在,则抛出异常
5. 遍历 map
可以使用迭代器来遍历 map 中的所有元素。map 中的元素默认按键的升序排列。
for (const auto& pair : my_map) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
6. 删除元素
可以使用 erase 函数来删除 map 中的元素。它可以接受一个键或一个迭代器。
my_map.erase(1); // 删除键为 1 的元素
auto it = my_map.find(2);
if (it != my_map.end()) {
my_map.erase(it); // 删除迭代器指向的元素
}
7. 查找元素
可以使用 find 函数来查找 map 中的元素。如果找到了元素,find 会返回一个指向该元素的迭代器;否则,返回一个指向 map 末尾的迭代器。
auto it = my_map.find(3); if (it != my_map.end()) { std::cout << "Found: " << it->first << ": " << it->second << std::endl; } else { std::cout << "Not found" << std::endl; }
8. 大小和容量
可以使用 size 函数来获取 map 中的元素数量,使用 empty 函数来检查 map 是否为空。
cpp
std::cout << "Size: " << my_map.size() << std::endl;
std::cout << "Empty: " << (my_map.empty() ? "true" : "false") << std::endl;
9. 自定义排序和比较
默认情况下,std::map 使用 std::less 对键进行排序。但是,你可以通过提供自己的比较函数或函数对象来更改排序方式。这通常在声明 map 时通过第三个模板参数来完成。
10. 注意事项
std::map 中的键必须是唯一的。
std::map 中的元素按键的升序排列。
使用 [] 运算符插入或访问元素时要小心,因为它会在键不存在时插入新元素。
在多线程环境中使用 std::map 时要谨慎,因为它不是线程安全的。如果需要线程安全的容器,可以考虑使用其他库(如 Intel TBB)中的容器或添加自己的同步机制。
在 C++ 的 std::map 中,你不能直接“插入多个值”作为一个单独的操作,但你可以通过循环或一系列单独的插入操作来添加多个键值对。下面是一个示例,展示如何在 std::map 中插入多个值:
#include <iostream> #include <map> int main() { std::map<int, std::string> my_map; // 使用 insert 成员函数插入多个值 my_map.insert(std::pair<int, std::string>(1, "one")); my_map.insert(std::pair<int, std::string>(2, "two")); my_map.insert(std::pair<int, std::string>(3, "three")); // 或者,使用 C++11 之后的初始化列表语法(更简洁) my_map.insert({4, "four"}); my_map.insert({5, "five"}); // 使用 [] 运算符(如果键不存在,则插入新元素) my_map[6] = "six"; my_map[7] = "seven"; // 遍历并打印 map 中的所有元素 for (const auto& pair : my_map) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } 在上面的示例中,我们首先声明了一个 std::map,其键是 int 类型,值是 std::string 类型。然后,我们使用 insert 成员函数和初始化列表语法向 map 中添加了多个键值对。最后,我们使用 [] 运算符插入了另外两个元素。请注意,使用 [] 运算符插入元素时,如果键已经存在,则会覆盖该键对应的值。 此外,如果你有一个包含多个键值对的容器(例如另一个 std::map、std::pair 的 std::vector 或 std::list),你可以使用循环和 insert 函数或范围插入(C++17 之后)来一次性插入多个元素。例如: std::vector<std::pair<int, std::string>> vec = {{8, "eight"}, {9, "nine"}}; for (const auto& pair : vec) { my_map.insert(pair); } // 或者,使用范围插入(C++17 之后) my_map.insert(vec.begin(), vec.end());