C++ STL set容器常用用法
转自:https://blog.csdn.net/CerberuX/article/details/51774121
set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。
1.set容器的常用操作
使用时注意包含头文件<set> std::set and std::multiset associative containers s.begin() 返回set容器的第一个元素 s.end() 返回set容器的最后一个元素 s.clear() 删除set容器中的所有的元素 s.empty() 判断set容器是否为空 s.insert() 插入一个元素 s.erase() 删除一个元素 s.size() 返回当前set容器中的元素个数
set模板原型://Key为元素(键值)类型
template <class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) >
2.set容器的创建
#include <iostream> #include <set> #include <functional> using namespace std; set<int> s; int main(){ set<int > seta; //默认是小于比较器less<int>的set set<int, greater<int> > setb; //创建一个带大于比较器的set,需包含头文件functional int a[5] = {1,2,3,4,5}; set<int > setc(a,a+5); //数组a初始化一个set; set<int > setd(setc.begin(),setc.end()); //setc初始化一个set //上述两例均为区间初始化 set<int > sete(setd); //拷贝构造创建set return 0; }
3.set容器的增删改查
①插入
#include <iostream> #include <set> using namespace std; set<int >s; void setprint(int cnt){ cout << "Test output :" << cnt << ":" << endl; for(set<int>::iterator it = s.begin(); it!= s.end(); it++) cout << *it << " "; puts(""); return ; } int main(){ int cnt = 1; s.insert(1); s.insert(2); s.insert(5); setprint(cnt++); s.insert(2); //set只允许用一个值出现一次,要插入相同元素请用multiset setprint(cnt++); int a[4] = {11,12,13,14}; s.insert(a,a+4); //将区间[a, a+4]里的元素插入容器 setprint(cnt++); return 0; }

②删除
s.erase() 删除一个元素
s.clear() 删除set容器中的所有的元素
#include <iostream> #include <set> using namespace std; set<int >s; void setprint(int cnt){ cout << "Test output :" << cnt << ":" << endl; for(set<int>::iterator it = s.begin(); it!= s.end(); it++) cout << *it << " "; puts(""); return ; } int main(){ int cnt = 1; for(int i = 1; i < 11; i++){ s.insert(i); } setprint(cnt++); s.erase(9); //根据元素删除 setprint(cnt++); set<int>::iterator ita = s.begin(); set<int>::iterator itb = s.begin(); s.erase(ita); //删除迭代器指向位置的元素 setprint(cnt++); ita = s.begin(); itb = s.begin(); itb++;itb++; s.erase(ita,itb); //删除区间[ita,itb)的元素 setprint(cnt); s.clear(); return 0; }

③修改
不能直接修改容器内数据,所以只能删除某元素再插入要修改的数值。
④查找
s.find() 查找一个元素,如果容器中不存在该元素,返回值等于s.end()
#include <iostream> #include <set> using namespace std; set<int >s; void setprint(int cnt){ cout << "Test output :" << cnt << ":" << endl; for(set<int>::iterator it = s.begin(); it!= s.end(); it++) cout << *it << " "; puts(""); return ; } int main(){ int cnt = 1; s.insert(1); s.insert(2); s.insert(5); setprint(cnt++); if(s.find(2) != s.end()) cout << "2 is existent" << endl; else cout << "2 is non-existent" << endl; if(s.find(3) == s.end()) cout << "3 is non-existent" << endl; else cout << "2 is existent" << endl; return 0; }

②判断元素是否在set中 & 判断set是否为空
#include <iostream> #include <set> #include <functional> using namespace std; int main(){ set<int > s; if(s.empty()) cout << "容器为空" << endl; s.insert(1); if(!s.empty()) cout << "容器不为空" << endl; if(s.count(1)) cout << "1在容器中" << endl; if(!s.count(2)) cout << "2不在容器中" << endl; return 0; }


浙公网安备 33010602011771号