Map容器详解

简介: Map容器详解

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());
相关文章
|
4月前
|
存储 C++ 索引
|
5月前
|
存储 算法 NoSQL
C++一分钟之-map与set容器详解
【6月更文挑战第21天】C++ STL的`map`和`set`是基于红黑树的关联容器,提供有序存储和高效查找。`map`存储键值对,键唯一,值可重复;`set`仅存储唯一键。两者操作时间复杂度为O(log n)。常见问题包括键的唯一性和迭代器稳定性。自定义比较函数可用于定制排序规则,内存管理需注意适时释放。理解和善用这些工具能提升代码效率。
63 3
|
5月前
|
存储 人工智能 C++
map容器在C++中的具体用法以及相关注意点
map容器在C++中的具体用法以及相关注意点
52 1
|
5月前
|
C++ 容器
C++ STL标准库 《map容器详解》
C++ STL标准库 《map容器详解》
44 0
|
5月前
|
存储 C++ 容器
C++ STL标准库 《map容器详解》
C++ STL标准库 《map容器详解》
72 0
|
5月前
|
C++ 容器
C++之map/multimap容器
C++之map/multimap容器
|
5月前
|
编译器 C++ 容器
通过红黑树封装 map 和 set 容器
通过红黑树封装 map 和 set 容器
|
6月前
|
C++ 索引 容器
黑马c++ STL部分 笔记(9) map/multimap容器
黑马c++ STL部分 笔记(9) map/multimap容器
|
6月前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
45 0
|
6天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
28 2