(转)STL中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> using namespace std; int main() { set<int>eg1; //插入 eg1.insert(1); eg1.insert(100); eg1.insert(5); eg1.insert(1);//元素1因为已经存在所以set中不会再次插入1 eg1.insert(10); eg1.insert(9); //遍历set,可以发现元素是有序的 set<int>::iterator set_iter=eg1.begin(); cout<<"Set named eg1:"<<endl; for(;set_iter!=eg1.end();set_iter++) cout<<*set_iter<<" "; cout<<endl; //使用size()函数可以获得当前元素个数 cout<<"Now there are "<<eg1.size()<<" elements in the set eg1"<<endl; if(eg1.find(200)==eg1.end())//find()函数可以查找元素是否存在 cout<<"200 isn't in the set eg1"<<endl; set<int>eg2; for(int i=6;i<15;i++) eg2.insert(i); cout<<"Set named eg2:"<<endl; for(set_iter=eg2.begin();set_iter!=eg2.end();set_iter++) cout<<*set_iter<<" "; cout<<endl; //获得两个set的并 set<int>eg3; cout<<"Union:"; set_union(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));//注意第五个参数的形式 copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," ")); cout<<endl; //获得两个set的交,注意进行集合操作之前接收结果的set要调用clear()函数清空一下 eg3.clear(); set_intersection(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin())); cout<<"Intersection:"; copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," ")); cout<<endl; //获得两个set的差 eg3.clear(); set_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin())); cout<<"Difference:"; copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," ")); cout<<endl; //获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩B eg3.clear(); set_symmetric_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin())); copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," ")); cout<<endl; return 0; set会对元素进行排序,那么问题也就出现了排序的规则是怎样的呢?上面的示例代码我们发现对int型的元素可以自动判断大小顺序,但是对char*就不会自动用strcmp进行判断了,更别说是用户自定义的类型了,事实上set的标准形式是set<Key, Compare, Alloc>,
下面给出一个关键字类型为char*的示例代码 #include<iostream> int main() set<const char*,ltstr> A(a, a + N); cout << "Set A: "; cout << "Union: "; cout << "Intersection: "; 其中的ltstr也可以这样定义 更加通用的应用方式那就是数据类型也是由用户自定义的类来替代,比较的函数自定义,甚至可以加上二级比较,比如首先按照总分数排序,对于分数相同的按照id排序,下面是示例代码 #include<set> return false; int main() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决