STL学习记录(八)Sets、Multisets
来源:互联网 发布:java符号 编辑:程序博客网 时间:2024/06/17 17:55
STL关联容器Set、Multiset
Set、Multiset简介
Set和Multiset会依据一定的排序准则自动的将容器里面的元素进行排序。这也就表明关联容器与顺序容器的一个最大不同就是元素的顺序与元素插入容器的先后无关。set、multiset的不同在于前者不允许容器内部有相同的元素,而后者则是允许的。因为容器对元素进行自动排序,这就表明set、multiset中的元素类型必须是可以进行比较的,或者说其中的元素有自己的比较准则。使用这两个容器的时候都要包含头文件< set >
容器的类模板定义如下:
namespace std { template <typename T, typename Compare = less<T>, typename Allocator = allocator<T> > class set; template <typename T, typename Compare = less<T>, typename Allocator = allocator<T> > class multiset;}
改模板中的第二个参数定义了元素的排序策略,默认情况下采用 < ,第三个参数定义了内存模型,默认情况下为c++标准库的allocator模型
Set和Multiset的实现就像数据中的二叉平衡树,并且该二叉树还是排序树。从这个数据结构中我们就可以了解到它们最大的一个优势:在搜索特定值的元素时会比一般的线性搜索时间会短很多,尤其是在数据量非常大的时候更为明显。但是自动排序功能也给Set和Multiset造成了一个很大的限制:不能去更改容器里元素的值。因为元素的位置是在元素进入容器时根据元素的值确定的,你改变了元素的值将使得该元素在一个不正确的位置上。因此你要改变某个元素的值,可以采用:先删除该元素,然后插入新元素(从这个角度来看的话,可以“认为”容器的元素都是const类型的)。
常用类:
迭代器类:
插入、移除元素:
需要注意的是插入函数insert()和emplace( )的返回类型的差别:
//set中的接口:pair<iterator,booL> insert(const value_type& val);iterator insert(const_iterator posHint, const value_type& val);template<typename... Args>pair<iterator,booL> empalce(Args&&... args);template<typename... Args>iterator emplace_hint(const_iterator posHint,Args&&... args);//multiset中的接口:iterator insert(const value_type& val);iterator insert(const_iterator posHint, const value_type& val);template<typename... Args>iterator empalce(Args&&... args);template<typename... Args>iterator emplace_hint(const_iterator posHint,Args&&... args);
这里返回类型的差别是因为multiset允许有重复值而set不允许。因此set插入一个元素的时候可能会失败,所以set返回的类型使用了pair结构。pair结构中第一个参数返回的是新插入元素的位置或者已有元素的位置,第二个参数返回的是是否插入成功(标明了第一个参数是新插入元素的位置还是已有元素的位置)
一些特殊的搜索操作:
代码示例1:
#include<iostream>#include<set>using namespace std;int main( ){ set<int> c; c.insert(1); c.insert(2); c.insert(4); c.insert(5); c.insert(6); cout<<"lower_bound(3): "<<*c.lower_bound(3) <<endl; cout<<"upper_bound(3): "<<*c.upper_bound(3) <<endl; cout<<"equal_bound(3): "<<*c.equal_bound(3).first<<" "<<*c.equal_bound(3).second<<endl; cout<<endl; cout<<"lower_bound(5): "<<*c.lower_bound(5) <<endl; cout<<"upper_bound(5): "<<*c.upper_bound(5) <<endl; cout<<"equal_bound(5): "<<*c.equal_bound(5).first<<" "<<*c.equal_bound(5).second<<endl;}
程序输出(multiset结果一样):
lower_bound(3): 4
lower_bound(3): 4
lower_bound(3): 4 4
lower_bound(5): 5
lower_bound(5): 6
lower_bound(5): 5 6
代码示例2:
#include <iostream>#include <set>#include <algorithm>#include <iterator>using namespace std;int main(){ set<int,greater<int> > coll;//采用大于准则排序而不是默认的小于准则 coll.insert({5,6,2,3,1}); coll.insert(5); for(int elem : coll) { cout<<elem<<" "; } cout<<endl; auto status_3 = coll.insert(3); if(status_3.second) cout<<"3 insert as new element"<<endl; else cout<<"3 already exists"<<endl; cout<<"3 at: "<<distance(coll.begin(),status_3.first)+1<<endl;//返回该元素的位置 auto status_4 = coll.insert(4); if(status_4.second) cout<<"4 insert as new element"<<endl; else cout<<"4 already exists"<<endl; cout<<"4 at: "<<distance(coll.begin(),status_4.first)+1<<endl; status_3 = coll.insert(3); cout<<"after insert 4, 3 at "<<distance(coll.begin(),status_3.first)+1<<endl; return 0;}
程序输出为:
6 5 3 2 1
3 already exists
3 at 3
4 insert as new element
4 at 3
after insert 4, 3 at 4
- STL学习记录(八)Sets、Multisets
- STL系列(8): Sets & MultiSets
- C++ Sets & MultiSets
- C++ Sets & MultiSets
- STL与泛型编程<五>:Sets和Multisets
- 关联式容器:Sets、Multisets、Maps、Multimaps
- Guava学习之Multisets
- Sets-STL
- STL学习记录(一):STL简介
- Codeforce GCD Table STL中的multisets
- STL容器Set和Multisets使用
- LogBack学习记录(八)综合例子
- 无人机驾驶员培训学习记录(八)
- STL学习记录(二):迭代器简要
- STL学习记录(四):Vector
- STL学习记录(五):Deque
- STL学习记录(六):List
- STL学习记录(七):Forward List
- C#调用笔记本摄像头
- 疯狂Java学习笔记(49)------------异常处理机制
- 最近打算学习下flash开发,搭建一个flascc的环境,遇到了点问题
- Python计算斐波那契数列
- LogisticRegression
- STL学习记录(八)Sets、Multisets
- 二分归并排序
- thinking in java 11——Arrays相关方法源码
- Google MapReduce读后感
- OpenGL 中常用的 GLUT 函数库
- 文件名或路径太长导致没法移动或复制
- hdu 5046 airport DLX可重复覆盖
- Swing线程实现进度条的更新
- 线程同步和线程通信