目录
1、map概述
1.1map简介
std::map
是C++ STL中的一个关联容器,其中的元素是成对出现的,称为键(key)和值(value)。键用于索引,而值则是与键相关联的数据。std::map
保证所有的键都是唯一的,并且按照键的顺序自动排序。map可以被视为一个动态的、有序的、唯一键的数组。
1.2map初始化
(1)默认初始化
std::map<int, std::string> myMap;
(2)指定大小初始化
std::map<int, std::string> myMap(10); // 10是预留空间的大小,不是元素数量
(3)初始化列表
std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}};
(4)复制初始化
std::map<int, std::string> anotherMap = myMap;
(5)范围初始化
std::vector<std::pair<int, std::string>> pairs = {{1, "one"}, {2, "two"}};
std::map<int, std::string> myMap(pairs.begin(), pairs.end());
- 关于std::pair补充:
在C++中,std::pair
是一个模板类,用于表示一对值的组合,通常用于存储两个相关联但可能不同类型的数据。std::pair
广泛用于STL容器中,如std::map
和std::multimap
,这些容器默认以std::pair
作为存储元素的类型。
2、map基本操作
2.1map添加元素
- 使用
insert()
方法添加单个元素:
std::map<int, std::string> myMap;
myMap.insert(std::make_pair(3, "three"));
- 使用
operator[]
添加并获取引用:
myMap[4] = "four";
2.2map读取元素( find(), at() )
- 下标访问:
std::string value = myMap[1];
- 迭代器访问:
std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}};
// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
auto it = myMap.find(1);
if (it != myMap.end()) {
std::string value = it->second; // 获取键为1的值
}
-
使用 at() 成员函数(C++17 引入):
std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}};
// 使用at()方法直接通过键访问值
if (myMap.count(1) > 0) {
std::string value = myMap.at(1); // 获取键为1的值
}
2.3删除元素
- 删除特定键的元素:
int n = myMap.erase(2);//删除成功返回1,否则返回0
- 删除迭代器指向的元素:
auto it = myMap.find(3);
if (it != myMap.end()) {
myMap.erase(it);
}
- 删除范围内元素:
myMap.erase(myMap.begin() + i, myMap.end());
- 清空map:
myMap.clear();
3、map高级操作
3.1遍历map
//基于范围的for循环
for (const auto& pair : myMap) {
std::cout << pair.first << " : " << pair.second << std::endl;
}
3.2使用lower_bound和upper_bound
lower_bound()
返回指向不小于给定键的最低元素的迭代器:
auto it = myMap.lower_bound(2);
upper_bound()
返回指向不大于给定键的最高元素的迭代器:
auto it = myMap.upper_bound(2);
3.3equal_range
std::map::equal_range
函数返回一个std::pair
,其中包含两个迭代器:
first
:指向区间的开始,即指向不小于给定键的最低元素的迭代器。second
:指向区间的结束,即指向大于给定键的最高元素的迭代器的下一个位置。
在std::map
中,因为所有的元素都是唯一的,所以equal_range
实际上会返回一个包含单个元素的区间,如果给定的键存在于容器中的话。
std::pair<int, std::string> range = myMap.equal_range(3);
4、内部函数汇总
std::map
提供了一系列的成员函数来操作容器中的元素:
size()
: 返回容器中的元素数量。empty()
: 检查容器是否为空。clear()
: 移除容器中的所有元素。insert()
: 向容器中插入元素。erase()
: 从容器中删除元素。find()
: 查找具有特定键的元素。count()
: 返回具有特定键的元素数量(由于键的唯一性,结果总是0或1)。lower_bound()
: 返回指向不小于给定键的最低元素的迭代器。upper_bound()
: 返回指向不大于给定键的最高元素的迭代器。equal_range()
: 返回一个范围,包含与给定键相等的所有元素(在map中总是一对迭代器)- value_comp() :返回比较容器中元素的函数对象,用来比较两个元素是否相等。
5、写在最后
std::map
是一个功能强大的容器,适用于需要有序、唯一键值对的场景。通过掌握其基本操作和高级功能,可以有效地管理数据集合。在实际编程中,合理利用map可以提高代码的效率和可读性。
才疏学浅,然孜孜不倦。
欢迎大家批评指正 !
版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。