三、①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集合容器相关推荐

  1. C++multiset集合

    multiset集合容器: ------ 和set的区别:set容器中所有的元素必须独一无二,而multiset容器中元素可以重复 调用头文件: #include<set> using n ...

  2. STL_set集合容器+map映照容器

    set集合容器使用一种红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,来组织泛华的元素数据.元素数据的检索,使用二叉检索树得中序遍历算法,检索的效率高于vector.deque和li ...

  3. 深入分析 Jdk - 集合容器 Map 与 Set

    SegmentFault 不兼容部分 markdown,详情请见 深入分析 Jdk - 集合容器 Map 与 Set

  4. 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )

    文章目录 queue 队列 stack 栈 priority_queue 优先级队列 priority_queue 优先级队列指定排序方法 priority_queue 优先级队列排序行为 prior ...

  5. 01.Python基础-3.集合容器

    1 列表list 1.1 列表介绍 Python内置的一种数据类型是列表:list. 有序的集合,可随时添加和删除其中的元素. 每个元素都分配一个数字 --它的位置,或索引.0,1,2,3-- 可存放 ...

  6. 《Java编程思想》学习笔记9——集合容器高级

    1.Arrays.asList()方法产生的List是一个固定长度的数组,只支持不改变长度的操作,任何试图改变其底层数据结构长度的操作(如,增加,删除等操作)都会抛出UnsupportedOperat ...

  7. 《Java编程思想》学习笔记4——集合容器

    1.集合中添加另一个集合的方法: (1).Collection.addAll(被添加的Collection对象)方法: 如:list1.addAll(list2); (2).Collections.a ...

  8. STL之set集合容器

    set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键 ...

  9. Java集合容器面试题

    文章目录 集合容器概述 什么是集合 集合的特点 集合和数组的区别 使用集合框架的好处 常用的集合类有哪些? List,Set,Map三者的区别?List.Set.Map 是否继承自 Collectio ...

最新文章

  1. 图的深度搜索c语言,求图的深度优先搜索!该怎么处理
  2. AV1生态系统更新:2019年6月
  3. 河海大学2019计算机考研分数线,河海大学2019年硕士研究生复试分数线
  4. 自定义EventSource(一)EventCounter
  5. var s=+newDate();的用法,表示对应的时间截
  6. java 模糊查询 分页(自定义标签)
  7. PyTest 生成多种格式的 测试报告 report
  8. Android 集成google地图
  9. database is locked错误
  10. html上下两个箭头符号怎么打出来,上下两个半箭头符号怎么打啊?高手进来看下,有图示的!...
  11. Android——距离传感器(PROXIMITY)的应用
  12. 解读翻译李飞飞-Hiding Data With Deep Networks
  13. 百度地图自定义大头针图片和添加标注
  14. 对接钉钉API语音功能相关文档
  15. DSP学习笔记之系统时钟、定时器、GPIO篇
  16. [NKNY]寒假培训《NY寒假有奖欢乐赛 》总结
  17. 四连通、八连通、m连通
  18. Java编程入门之前篇
  19. java奥运2008_用java实现2008北京奥运会倒计时
  20. python invalid argument_python使用open的OSError: [Errno 22] Invalid argument错误

热门文章

  1. html js点击字图片下拉,JavaScript实现文字与图片拖拽效果的方法
  2. Selenium1 Selenium2 WebDriver
  3. Extjs 数据代理
  4. input获得焦点和失去焦点
  5. django中间件及中间件实现的登录验证
  6. 开放才能进步!Angular和Wijmo一起走过的日子
  7. Safari支持Service Worker,PWA还有多久爆发?
  8. Python API简单验证
  9. Ubuntu 安装中文
  10. WPF 反编译后错误处理