set
set
的特性是:所有元素都会根据元素的键值自动被排序。set
的元素不像map
那样可以拥有实值(value)和键值(key),set
元素的键值就是实值,实值就是键值。set
不允许两个元素有相同的键值。
不可以通过迭代器改变set
的元素。因为set
元素值就是键值,关系到set
元素的排列规则。如果任意改变set
的元素值,会严重破坏set
组织。set<T>::iterator
被定义为底层RB-TREE的const_iterator
,杜绝写入操作。
set
拥有与list
相同的某些性质:当客户端对它进行元素新增操作(insert)或删除操作时(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效。
map
map
的特性是,所有元素都会根据元素的键值自动被排序。map
的所有元素都是pair
,同时拥有实值(value)和键值(key)。pair
的第一元素被视为键值,第二元素被视为实值。map
不允许两个元素拥有相同的键值。
不可以更改map
元素的键值,因为map
元素的键值关系到map
元素的排列规则。任意改变map
元素键值将会严重破坏map
组织。但是可以修改元素的实值。因为map
元素的实值并不影响map
元素的排列规则。
map
拥有和list
相同的某些性质:当客户端对它进行元素新增操作(insert)或删除操作(erase)时。操作之前的所有迭代器,在操作完成之后都依然有效。
map的插入方式有几种?
//insert函数插入pair数据
mp.insert(pair<int, string>(1, "ttt"));
//insert函数插入value_type数据
mp.insert(map<int,string>::value_type(1, "ttt"));
//insert函数使用make_pair()函数
mp.insert(make_pair(1, "ttt"));
//下标访问方式插入数据
mp[1] = "ttt";
map中[]和find的区别
- map的下标运算符的作用是:将键值作为下标去执行查找,并返回对应的实值;如果不存在这个键值,就将一个具有该键值和实值类型的默认值插入map中
- map的find函数:用键值执行查找,找到了返回该位置的迭代器;如果不存在,就返回尾迭代器;
unordered_map和map的区别和应用场景
map
支持键值的自动排序,底层机制是红黑树,红黑树的查询和维护,时间复杂度均为O(logn)
。但是空间占用比较大,因为每个节点要保持父节点,孩子节点及颜色的信息。
unordered_map
底层机制是哈希表。查询时间复杂度是O(1)
,维护时间与bucket桶所维护的list
长度有关,建立hash
表耗时较大。
map
适用于有序数据的应用场景,unordered_map
适用于高效查询的应用场景。