set和multiset集合容器
三、①set集合容器
简介:set集合的目的就是为了快速检索。set集合容器实现了红黑树的平衡二叉检索树的数据结构。set集合里面不允许有重复的元素出现;使用set容器前,需要在程序的头文件中声明 #include < set >。
函数方法总结:
1,元素的插入与中序遍历 insert();
2,元素的反向遍历,使用反向迭代器reverse_iterator,可以反向遍历集合,其中rbegin()和rend()这两个方法,分别给出了反向遍历的开始位置和结束位置。
3,元素的删除
❶删除set中迭代器所指的一个元素或一段区间中的所有元素 erase();
❷一次性删除set中的所有元素 clear();
4,元素的检索,若找到查找的键值,则返回该键值的迭代器位置,否则返回集合最后一个元素后面的一个位置及end() find();
5,自定义比较函数
1,set容器中元素的插入与中序遍历
#include <iostream>
#include<set>
using namespace std;int main()
{//set集合容器默认的比较规则下,是按元素由小到大插入set<int> s; //定义元素类型为int类型的集合对象s,当前没有任何元素s.insert(1); //第一次插入1这个元素s.insert(0);s.insert(4);s.insert(1); //第二次插入1,重复元素,不会插入set<int> :: iterator it; //定义前向迭代器it//使用前向迭代器对集合中序遍历,其结果正好是元素排序的结果for(it=s.begin();it!=s.end();it++){cout << *it <<" ";}//输出结果:0 1 4 从小到大排序,如果是前向迭代器迭代输出直接默认升序排列输出return 0;
}
2,元素的反向遍历
#include <iostream>
#include<set>
using namespace std;int main()
{set<int> s; //定义元素类型为int类型的集合对象s,当前没有任何元素s.insert(1); //第一次插入1这个元素s.insert(0);s.insert(4);s.insert(1); //第二次插入1,重复元素,不会插入set<int> :: reverse_iterator it; //定义反向迭代器itfor(it=s.rbegin();it!=s.rend();it++){cout << *it <<" ";}//输出结果:4 0 1 反向迭代输出,不排序,仅仅反向输出而已return 0;
}
3,元素的删除
#include <iostream>
#include<set>
using namespace std;int main()
{//set集合容器默认的比较规则下,是按元素由小到大插入set<int> s; //定义元素类型为int类型的集合对象s,当前没有任何元素s.insert(1); //第一次插入1这个元素s.insert(0);s.insert(4);s.insert(1); //第二次插入1,重复元素,不会插入s.erase(0); //删除键值为0的那个元素set<int> :: iterator it; //定义前向迭代器it//使用前向迭代器对集合中序遍历,其结果正好是元素排序的结果for(it=s.begin();it!=s.end();it++){cout << *it <<" ";}//输出结果:1 4 前向迭代输出cout <<endl;s.clear(); // 清空set集合s里面的所有元素cout<<s.size()<<endl;//输出结果为:0return 0;
}
4,元素的检索
#include <iostream>
#include<set>
using namespace std;int main()
{set<int> s ;s.insert(0);s.insert(1);s.insert(2);s.insert(3);s.insert(4);s.insert(5);s.insert(6);set <int> ::iterator it; //定义前向迭代器itit=s.find(4); //找4这个元素if(it!=s.end()) //若没到末尾之前找到了{cout << *it <<endl; //输出该值}//输出结果: 4else{cout << "not find it"<<endl; //没找到输出 not find it}return 0;
}
5,自定义比较函数
❶如果元素不是结构体,那么可以编写比较函数
#include <iostream>
#include<set>
using namespace std;struct myComp
{//C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。 bool beyond(const int &a,const int &b)//自己定义比较函数,要求由大到小排序//自定义比较函数myComp,重载“()”操作符bool operator()(const int &a,const int &b){if(a!=b)return a>b;elsereturn a>b;}
};int main()
{set<int> s;s.insert(2);s.insert(4);s.insert(1);s.insert(8);s.insert(9);s.insert(8); //第一次有8这个元素了,第二次不会再填进去set<int,myComp> :: iterator it; //定义前向迭代器for(it=s.begin();it!=s.end();it++){cout << *it <<" ";}//输出结果:1 2 4 8 9//??????有疑问??????按理说应该是 9 8 4 2 1cout<<endl;return 0;
}
❷如果元素是结构体,那么可以直接把比较函数写在结构体内
#include <iostream>
#include<set>
#include<string>
using namespace std;struct Info{string name;float score;//按分数高低排序bool operator < (const Info &a) const //重载“<”操作符,自定义排序规则{return a.score<score; //按score由大到小排列,如果要由小到大,使用“>”即可}
};
int main()
{set<Info> s; //定义元素类型为Info结构体的集合对象s,当前没有任何元素Info info; //定义Info类型元素//插入三个元素info.name="wsq";info.score=100.0;s.insert(info);info.name="beyond";info.score=99.5;s.insert(info);info.name="yy";info.score=66.6;s.insert(info);set<Info> :: iterator it;for(it=s.begin();it!=s.end();it++){cout<<(*it).name<<":"<<(*it).score<<endl;}return 0;
}
三、②multiset多重集合容器
简介:multiset和set一样,也是使用红黑树来组织元素数据的,唯一不同的是,multiset允许重复的元素键值插入,而set则不允许。使用multiset集合容器的时候,需要在头文件进行声明 #include< set >。
函数方法总结
1,multiset元素的插入 insert();
2,元素的删除
❶删除multiset对象中的某个迭代器位置上的元素、某段迭代器区间中的元素、键值等于某个值的所有重复元素,并返回删除元素的个数 erase();
❷一次性删除multiset中的所有元素 clear();
3,查找元素,使用find()方法查找元素,若找到返回该元素的迭代器位置(若重复,则返回第一个元素重复元素的迭代器的位置);若没有找到,则返回end()迭代器的位置。
1,multiset元素的插入与删除
#include <iostream>
#include<set>
#include<string>
using namespace std;int main()
{multiset<string> ms; //定义一个string类型的multiset集合容器 msms.insert("wsq"); //插入字符串ms.insert("1014");ms.insert("1202");ms.insert("wsq");ms.insert("1014");multiset<string>::iterator it; //定义前向迭代器it,会对multiset集合容器里面的元素默认进行升序排列for(it=ms.begin();it!=ms.end();it++){cout<<*it<<" "; //从输出结果就可以看出multiset集合容器可以存储重复的元素}//输出结果:1014 1014 1202 wsq wsqcout << endl<<endl;int n = ms.erase("1014"); //删除值为“1014”的所有重复元素,返回删除元素的总数2cout << "all elements after deleted :"<<n<<endl;for(it=ms.begin();it!=ms.end();it++){cout << *it <<" ";}cout <<endl;ms.clear(); //删除ms容器里面的所有元素cout << ms.size()<<endl; //返回ms容器的长度return 0;
}
2,查找元素
#include <iostream>
#include<set>
#include<string>using namespace std;int main()
{multiset<string> ms; //定义一个string类型的multiset集合容器 msms.insert("wsq"); //插入字符串ms.insert("1014");ms.insert("1202");ms.insert("wsq");ms.insert("1014");multiset<string>::iterator it; //定义前向迭代器it,会对multiset集合容器里面的元素默认进行升序排列it = ms.find("wsq"); //查找"wsq"这个字符串if(it!=ms.end()){cout << *it <<endl; //查找到之后输出}else{cout<<"not find it"<<endl; //若没有找打}it = ms.find("yy"); //查找"yy"字符串if(it!= ms.end()) //若找到{cout<<*it<<endl;}else //若找不到{cout<<"not find it"<<endl;}//由于有“wsq”这个字符串,所有输出“wsq”这个字符串,但是没有“yy”这个字符串,所以输出“not find it”//输出结果:wsq (换行) not find itreturn 0;
}
set和multiset集合容器相关推荐
- C++multiset集合
multiset集合容器: ------ 和set的区别:set容器中所有的元素必须独一无二,而multiset容器中元素可以重复 调用头文件: #include<set> using n ...
- STL_set集合容器+map映照容器
set集合容器使用一种红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,来组织泛华的元素数据.元素数据的检索,使用二叉检索树得中序遍历算法,检索的效率高于vector.deque和li ...
- 深入分析 Jdk - 集合容器 Map 与 Set
SegmentFault 不兼容部分 markdown,详情请见 深入分析 Jdk - 集合容器 Map 与 Set
- 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )
文章目录 queue 队列 stack 栈 priority_queue 优先级队列 priority_queue 优先级队列指定排序方法 priority_queue 优先级队列排序行为 prior ...
- 01.Python基础-3.集合容器
1 列表list 1.1 列表介绍 Python内置的一种数据类型是列表:list. 有序的集合,可随时添加和删除其中的元素. 每个元素都分配一个数字 --它的位置,或索引.0,1,2,3-- 可存放 ...
- 《Java编程思想》学习笔记9——集合容器高级
1.Arrays.asList()方法产生的List是一个固定长度的数组,只支持不改变长度的操作,任何试图改变其底层数据结构长度的操作(如,增加,删除等操作)都会抛出UnsupportedOperat ...
- 《Java编程思想》学习笔记4——集合容器
1.集合中添加另一个集合的方法: (1).Collection.addAll(被添加的Collection对象)方法: 如:list1.addAll(list2); (2).Collections.a ...
- STL之set集合容器
set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键 ...
- Java集合容器面试题
文章目录 集合容器概述 什么是集合 集合的特点 集合和数组的区别 使用集合框架的好处 常用的集合类有哪些? List,Set,Map三者的区别?List.Set.Map 是否继承自 Collectio ...
最新文章
- 图的深度搜索c语言,求图的深度优先搜索!该怎么处理
- AV1生态系统更新:2019年6月
- 河海大学2019计算机考研分数线,河海大学2019年硕士研究生复试分数线
- 自定义EventSource(一)EventCounter
- var s=+newDate();的用法,表示对应的时间截
- java 模糊查询 分页(自定义标签)
- PyTest 生成多种格式的 测试报告 report
- Android 集成google地图
- database is locked错误
- html上下两个箭头符号怎么打出来,上下两个半箭头符号怎么打啊?高手进来看下,有图示的!...
- Android——距离传感器(PROXIMITY)的应用
- 解读翻译李飞飞-Hiding Data With Deep Networks
- 百度地图自定义大头针图片和添加标注
- 对接钉钉API语音功能相关文档
- DSP学习笔记之系统时钟、定时器、GPIO篇
- [NKNY]寒假培训《NY寒假有奖欢乐赛 》总结
- 四连通、八连通、m连通
- Java编程入门之前篇
- java奥运2008_用java实现2008北京奥运会倒计时
- python invalid argument_python使用open的OSError: [Errno 22] Invalid argument错误