一篇搞懂C++ STL std::map键值对存储容器
【摘要】 @TOC 前言在C++标准模板库(STL)中,std::map 是一种非常重要的容器,用于存储键值对(key-value pairs)。它在程序中扮演着关键的角色,尤其是在需要根据键高效地存取、修改和删除值时。std::map 是一个有序的关联容器,能够确保键的唯一性并维护元素的有序性。理解 std::map 的使用和操作函数对于编写高效和灵活的代码至关重要。 什么是 std::map,以及...
@TOC
前言
在C++标准模板库(STL)中,std::map
是一种非常重要的容器,用于存储键值对(key-value pairs)。它在程序中扮演着关键的角色,尤其是在需要根据键高效地存取、修改和删除值时。std::map
是一个有序的关联容器,能够确保键的唯一性并维护元素的有序性。理解 std::map
的使用和操作函数对于编写高效和灵活的代码至关重要。
什么是 std::map
,以及为什么使用它?
std::map
是 C++ STL 中的一个关联容器,它存储键值对,其中每个键都是唯一的,并且元素按键的顺序自动排序。std::map
基于红黑树(通常的实现方式)来组织元素,这使得它能够高效地进行查找、插入和删除操作。
为什么使用 std::map
:
- 自动排序:元素根据键自动排序,方便按顺序遍历。
- 唯一键:保证每个键是唯一的,这在需要确保数据唯一性时非常有用。
- 高效操作:查找、插入和删除操作的时间复杂度为 O(log n),保证了操作的高效性。
- 键值对存储:可以灵活地存储和管理键值对,适合用于需要通过键快速访问和修改值的场景。
std::map
的构造函数
-
默认构造函数
std::map<int, std::string> myMap; // 创建一个空的std::map
-
使用比较函数的构造函数
std::map<int, std::string, std::greater<int>> myMap; // 创建一个空的std::map,使用降序比较函数
-
区间构造函数
std::vector<std::pair<int, std::string>> vec = {{1, "one"}, {2, "two"}}; std::map<int, std::string> myMap(vec.begin(), vec.end()); // 使用vector中的键值对初始化std::map
-
复制构造函数
std::map<int, std::string> original = {{1, "one"}, {2, "two"}}; std::map<int, std::string> copy(original); // 复制一个std::map
-
移动构造函数
std::map<int, std::string> original = {{1, "one"}, {2, "two"}}; std::map<int, std::string> moved(std::move(original)); // 移动构造一个std::map
std::map
的操作函数
-
insert()
std::map<int, std::string> myMap; myMap.insert(std::make_pair(1, "one")); // 插入键值对 myMap.insert({2, "two"}); // 另一种插入方式
-
emplace()
myMap.emplace(3, "three"); // 原地构造并插入元素
-
erase()
myMap.erase(1); // 删除键为1的元素 // 或者删除指定位置的元素 auto it = myMap.find(2); if (it != myMap.end()) { myMap.erase(it); }
-
find()
auto it = myMap.find(2); if (it != myMap.end()) { std::cout << "Key 2 has value: " << it->second << std::endl; }
-
operator[]
myMap[4] = "four"; // 插入键4及其对应的值 std::cout << "Value for key 4: " << myMap[4] << std::endl;
-
at()
try { std::cout << "Value for key 4: " << myMap.at(4) << std::endl; } catch (const std::out_of_range& e) { std::cout << e.what() << std::endl; // 处理键不存在的情况 }
-
clear()
myMap.clear(); // 清空所有元素
-
size()
和empty()
std::cout << "Size: " << myMap.size() << std::endl; std::cout << "Is empty: " << myMap.empty() << std::endl;
示例代码
下面的示例展示了 std::map
的各种构造函数和操作函数的使用:
#include <iostream>
#include <map>
#include <vector>
int main() {
// 使用默认构造函数创建std::map
std::map<int, std::string> myMap;
// 使用插入函数
myMap.insert(std::make_pair(1, "one"));
myMap.insert({2, "two"});
// 使用emplace函数
myMap.emplace(3, "three");
// 查找元素
auto it = myMap.find(2);
if (it != myMap.end()) {
std::cout << "Key 2 has value: " << it->second << std::endl;
}
// 使用operator[]访问或插入元素
myMap[4] = "four";
std::cout << "Value for key 4: " << myMap[4] << std::endl;
// 使用at函数访问元素
try {
std::cout << "Value for key 4: " << myMap.at(4) << std::endl;
} catch (const std::out_of_range& e) {
std::cout << e.what() << std::endl;
}
// 删除元素
myMap.erase(1);
auto it2 = myMap.find(3);
if (it2 != myMap.end()) {
myMap.erase(it2);
}
// 清空std::map
myMap.clear();
// 检查大小和是否为空
std::cout << "Size: " << myMap.size() << std::endl;
std::cout << "Is empty: " << myMap.empty() << std::endl;
// 使用区间构造函数
std::vector<std::pair<int, std::string>> vec = {{5, "five"}, {6, "six"}};
std::map<int, std::string> anotherMap(vec.begin(), vec.end());
std::cout << "Another map size: " << anotherMap.size() << std::endl;
return 0;
}
总结
std::map
是一个功能强大的关联容器,它通过键值对来存储数据,自动维护元素的有序性,并确保键的唯一性。它基于红黑树实现,提供高效的查找、插入和删除操作。通过理解 std::map
的各种构造函数和操作函数,你可以在需要键值对存储和有序数据管理的场景中有效地应用它。掌握这些操作将帮助你在编写复杂数据管理代码时选择合适的数据结构,提升代码的性能和可维护性。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)