stl的map和set

概念

map和set底层都是红黑树

set是key模型结构,本质就是看一个元素在不在容器中。

map是key/value结构,里面存了一个pair结构,可以通过一个值来查找另外一个值

map和set结构中遍历出来的都是有序并且去重了的,map和set都支持增删查并不支持改,因其底层是红黑树,改数据会使其不再是红黑树的结构了

pair结构

pair结构就是一个键值对

map插入的三种方法

1对象插入

map<string,string> dict;
pair<string,string> kv1("排序","sort");
pair<string,string> kv2("左边","left");
dict.insert(kv1);
dict.insert(kv2);

2匿名对象插入

map<string,string> dict;
dict.insert(pair<string,string>("排序","sort"));
dict.insert(pair<string,string>("左边","left"));

3make_pair插入

map<string,string> dict;
dict.insert(make_pair("排序","sort"));
dict.insert(make_pair("左边","left"));

make_pair是最好用的,因为其可以自动识别类型

set

set默认是排升序,参数传greater可以排降序

插入可以直接用值来作参数

也可以插入一段迭代器区间

插入的返回值也是一个pair结构

map

set没有支持【】操作而map支持了,

标题

它的参数是pair中的first,返回值是pair中的second,并且返回的是引用,可以根据first来修改second

例如:统计水果次数

string arr[]={"苹果","西瓜","香蕉","苹果","西瓜","西瓜","西瓜","苹果"};
map<string,int> countmap;
for(auto str : arr)
{
	countmap[str]++;
}

此外【】自带插入功能,如果是第一次出现“西瓜”这个字符,他会自动插入,如果是第二次甚至多次出现,他会自动计数++

【】的功能:1插入2查找3修改

multimap和multiset

map和set是排序加去重,multimap和multiset是排序,没有去重

### C++ STL中 `map` `set` 的使用方法与主要差异 #### 使用方法 ##### 创建初始化 对于 `map`,可以通过多种方式创建初始化。例如: ```cpp std::map<int, std::string> myMap; myMap[1] = "one"; myMap.emplace(2, "two"); myMap.insert({3, "three"}); ``` 上述代码展示了三种向 `map` 插入数据的方式:通过下标运算符、`emplace` 方法以及 `insert` 函数[^5]。 对于 `set`,其创建初始化也十分直观: ```cpp std::set<int> mySet; mySet.insert(1); mySet.insert(2); mySet.insert(3); ``` 这里展示了一个简单的插入过程,其中 `set` 自动保持内部元素有序且唯一[^4]。 ##### 遍历 遍历 `map` 可以采用如下形式: ```cpp for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } ``` 而对于 `set` 则可以这样遍历: ```cpp for (const auto& elem : mySet) { std::cout << elem << " "; } ``` #### 主要差异 1. **存储结构** - `set` 存储的是单一的值,并自动去重,适合用来表示不重复的数据集合[^1]。 - `map` 存储的是键值对,允许通过键快速访问对应的值。 2. **用途** - 如果仅需维护一组唯一的值,则应选用 `set`。 - 若需要管理一系列具有映射关系的数据(即键值对),则更适合使用 `map`。 3. **性能特性** - 对于查找操作,两者都提供平均 O(log n) 时间复杂度的表现,这是因为它们通常基于平衡二叉树实现。 - 当涉及到修改已存在元素时,需要注意 `set` 不支持直接更改已有元素的内容,因为这可能破坏顺序;而 `map` 中可以直接更新某个特定键所对应之值[^2]。 4. **扩展性** - 还存在多态版本如 `multiset` `multimap` ,分别允许多次插入相同的单个值或者多个相同键的不同值[^3]。 综上所述,在具体应用过程中应当依据实际需求来决定到底选择哪种容器类型更为恰当。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值