C++STL之set容器
程序员文章站
2022-07-10 17:50:39
set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名 ......
set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection) 差(set_difference) 并(set_union) 对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。
#include<set> #include<iterator> #include<iostream> #include<algorithm> using namespace std; int main() { set<int>v1; //insert插入 v1.insert(1); v1.insert(4); v1.insert(5); v1.insert(1); //元素1因为已经存在所以set中不会再次插入1 v1.insert(3); v1.insert(2); //遍历set,可以发现元素是有序的 set<int>::iterator it; for(it=v1.begin();it!=v1.end();it++) //集合v1{1 2 3 4 5} cout<<*it<<" "; cout<<endl; //使用size()函数可以获得当前元素个数 5 cout<<v1.size()<<endl; if(v1.find(200)==v1.end()) //find()函数可以查找元素是否存在 cout<<"200 isn't in the set v1"<<endl; //find会挨个查找set, //当到达set.end()时,就是一个也没找到,返回end() set<int>v2; for(int i=3;i<=10;i++) //集合v2{3 4 5 6 7 8 9 10} v2.insert(i); for(it=v2.begin();it!=v2.end();it++) cout<<*it<<" "; cout<<endl; set<int>v3; //获得两个set的并
//v1并v2 -> 集合v3 {1 2 3 4 5 6 7 8 9 10} set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v3,v3.begin())); v3.clear(); //注意进行集合操作之前接收结果的set要调用clear()函数清空 //获得两个set的交
//v1交v2 -> 集合v3 {3 4 5} set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v3,v3.begin())); v3.clear();
//获得两个set的差,也就是上集合-下集合,下集合多出来的不管
//v1差v2 -> 集合v3{1 2} set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v3,v3.begin())); v3.clear();
//获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩B
//v1对称差v2 -> 集合v3{1 2 6 7 8 9 10} set_symmetric_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),inserter(v3,v3.begin())); return 0; }