C++一分钟之-map与set容器详解
创作时间:
作者:
@小白创作中心
C++一分钟之-map与set容器详解
引用
1
来源
1.
https://developer.aliyun.com/article/1543436
在C++ Standard Template Library(STL)中,
map
和set
作为关联容器,为开发者提供了键值对存储和唯一键集合管理的强大工具。它们底层通常基于红黑树实现,保证了元素的有序性和对数时间复杂度的查找效率。本文将深入浅出地解析map
与set
的使用方法、常见问题及其规避策略,并通过代码示例加以说明。
map:键值对的天堂
map
容器存储键值对,其中键是唯一的,值可以重复。键用于排序和查找,值则存储实际数据。map
中的元素默认按照键的升序排列。
常见问题与避免策略:
- 键的唯一性 :尝试插入已存在的键会导致插入失败,而不是覆盖原有值。若需覆盖,请先检查键是否存在,再决定插入或更新。
std::map<std::string, int> myMap;
myMap["apple"] = 4; // 插入或更新
if (myMap.find("banana") != myMap.end()) {
myMap.erase("banana"); // 删除后再插入实现覆盖效果
myMap["banana"] = 2;
}
- 性能考量 :查找、插入和删除操作的时间复杂度均为O(log n),但频繁的插入和删除可能导致树的不平衡,影响性能。适度的重平衡(如通过迭代器失效后的自动调整)可以缓解这一问题。
set:无重复的键集合
set
类似于map
,但只存储键,没有对应的值,所有元素都是唯一的。它同样按照键的升序排列。
常见问题与避免策略:
- 元素唯一性 :试图插入重复元素将被忽略,这是
set
设计的初衷。确保插入前元素的唯一性,或利用此特性进行去重。
std::set<int> mySet;
mySet.insert(1); // 成功插入
mySet.insert(1); // 重复,不会插入
- 迭代器稳定性 :在
set
和map
中,插入新元素或删除现有元素不会导致其他元素的迭代器失效,但插入或删除操作点的迭代器会失效。在遍历时谨慎操作集合。
共同注意事项
- 自定义比较函数 :默认情况下,键按字典顺序排序。可以通过提供自定义比较函数或比较对象来自定义排序规则。
struct CaseInsensitiveCompare {
bool operator()(const std::string& lhs, const std::string& rhs) const {
return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(),
[](char a, char b){
return tolower(a) < tolower(b); });
}
};
std::map<std::string, int, CaseInsensitiveCompare> caseInsensitiveMap;
- 内存管理 :
map
和set
中的元素是按需分配的,删除元素不会立即释放内存,直到容器销毁或调用shrink_to_fit()
。对于内存敏感的应用,需要注意适时释放不再使用的内存。
总结
map
和set
作为C++ STL中的重要成员,以其独特的键值存储和集合管理能力,在数据处理和算法实现中扮演着关键角色。正确理解和运用它们,可以显著提升代码的效率和清晰度。面对它们的潜在陷阱,如键的唯一性、性能考量以及迭代器的使用,采取合理的规避策略至关重要。通过实践和不断探索,你将能更加得心应手地驾驭这些强大的容器。
热门推荐
有医说一丨髋关节有响声,可能是弹响髋综合征!
《王者荣耀》典韦皮肤手感排名汇总2024
怪物猎人WIKI中文版正式上线 为玩家提供全面游戏资料
使命必达先生:一位快递员的励志故事
奥灶面为什么叫奥灶面?美食背后的多重传奇
房屋结构大盘点:砖混、框架、钢架构,哪种房子更抗震、更安全?
40、50岁女性夏季穿搭指南:绿色搭配技巧全解析
坐在王传福和雷军中间的企业家,有多牛
非遗技艺“老龄化”,如何“传”下去“火”起来?
新疆青铜时代考古新突破:呼斯塔遗址发现方形石围封土墓
教师资格证丢失该如何补办
什么是莱斯特城奇迹?
智能家居设备:提升生活便利与安全的多角度升级
各种豆类含嘌呤高吗?一文读懂豆类嘌呤含量与健康关系
神话中的水火不容:共工与祝融的故事
小儿咳嗽伴有黄痰怎么办?全面解析原因与应对措施
企业如何制定ESG战略?
旧瓷砖翻新不敲掉可以直接贴新砖吗?
溶血性贫血血清胆红素会升高吗
《哪吒2》海外未映先火,多国观众期待值拉满,喊话:“等不及了”
长江禁渔三年多 鱼儿们过得怎么样?
日照金山这样拍,摄影大片自然来
佩戴本命佛的讲究与禁忌:十二生肖专属守护神
锦州往事:张作霖为何葬于辽西不起眼的小村庄?驿马坊有何神秘?
肥胖能不能吃橘子
虹桥机场T2航站楼,揭秘其含义与功能
如何实现AI与老年人的双向奔赴
跟着文化特派员,在卖花渔村触摸非遗的脉动
中国交通法律法规全解析:从基础规定到新兴挑战
明确核心观点对职场发言的重要性是什么?