set容器是一个集合容器。包含元素是唯一的。集合元素按照一点顺序排列,元素插入过程是顺序插入,所有不能插入指定位置。
set采用红黑树变体的数据结构实现。红黑树属于平衡二叉树。再插入和删除上比vector快。
set不能直接存取元素(不能用at.()和[])
multiset和set大致相同,但是set支持唯一键值,每个元素只能出现一遍。而multiset可以出现多次。(会自动去重)
不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值只能先删除后插入新的元素值
构造与其他容器没有什么区别。
set.insert(elem)只用插入元素就可以了会自动排序
同样有
set.begin
set.end
set.rbegin
set.rend
这些常见的迭代器
set的内部的默认排序是升序排列的
set.swap();
删除如下
set.clear()
set.erase(pos)
set.erase(beg,end)
set.erase(elem)如果没有就会返回0,有就会删除并且返回1
set不支持反向迭代器对元素进行删除
通过迭代器删除以后,迭代器会重新指向set容器中的第一个元素
set容器的元素排序
set.<int,less<int>> s1;升序排序(不输就默认)
set<int,greater<int>> s2;降序排序
less<>和geater<>都是对象
可以通过自己写对象来更改排序方式
接下来是set的查找
set.find(elem)返回指向elem的迭代器
set.count(elem)查找数值为elem的迭代器,set只有0或1.multiset可能会更多
set.lower_bound(elem)找到第一个>=elem元素的迭代器器
set.higher_bound(elem)找到第一个>elem元素的迭代器
set.equal_range(elem)
找一个与elem相等的上下限的两个迭代器(上闭下开)
例如1,3,5,7,9
elem=5,那么就会返回5和7元素的迭代器
而返回的则用pair进行存放
pair可以将2个值视为一个单元
pair<t1,t1>两个值的类型可以不一样
pair.first是第一个成员变量的类型
pair.second是第二个成员变量的类型
pair<set<int>::iterator,set<int>::iterator>=s1.equal_range(elem)
类似与这样使用
如果elem不存在,则根据编译器的不同会出现不同的结果
map容器
map不允许容器中有重复的key值元素 multimap允许容器中有重复的key值元素
map<t1,t2>
multiple<t1,t2>
如map<int,char> mapA;
第一种插入方式
map.insert(pair<int,string>(3,"小张");)
第二种插入元素,返回pair
map.insert(pair(3,"小张"))
直接插pair
第三种通过value_type
map.insert(map<int,string>)::value_type(1,"小李");
第四种
通过数组的方式插入
map[3]="小刘"
但是这种会先去删除已有的对象。而前面的方法不会。
map容器对象获取键对应的值
第一种使用[]
第二种使用find()Hanshu1.成功返回对应的迭代器,失败返回end()的迭代器
第三章使用at()函数,如果键值不存在就会抛出out_of_range异常