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());
相关文章
|
5天前
|
存储 算法 NoSQL
C++一分钟之-map与set容器详解
【6月更文挑战第21天】C++ STL的`map`和`set`是基于红黑树的关联容器,提供有序存储和高效查找。`map`存储键值对,键唯一,值可重复;`set`仅存储唯一键。两者操作时间复杂度为O(log n)。常见问题包括键的唯一性和迭代器稳定性。自定义比较函数可用于定制排序规则,内存管理需注意适时释放。理解和善用这些工具能提升代码效率。
12 3
|
19天前
|
存储 人工智能 C++
map容器在C++中的具体用法以及相关注意点
map容器在C++中的具体用法以及相关注意点
16 1
|
21小时前
|
编译器 C++ 容器
通过红黑树封装 map 和 set 容器
通过红黑树封装 map 和 set 容器
|
1月前
|
C++ 索引 容器
黑马c++ STL部分 笔记(9) map/multimap容器
黑马c++ STL部分 笔记(9) map/multimap容器
|
1月前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
20 0
|
1月前
|
C++ 容器
STL—map容器
STL—map容器
|
1月前
|
存储 算法 Java
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
42 0
|
1月前
|
编译器 容器
map映照容器
map映照容器 map映照容器
|
1月前
|
容器
C++map/multimap容器
C++map/multimap容器
|
10天前
|
NoSQL 关系型数据库 Redis
Docker的通俗理解和通过宿主机端口访问Redis容器的实例
本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。 关键点: - Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。 - `docker pull` 拉取镜像,如 `redis:3.0`。 - `docker run -d --name` 后台运行容器,如 `my-redis`。 - `-p` 参数做端口映射,如 `6379:6379`。 - `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。