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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript获取select的值全解

获取显示的汉字 document.getElementById("bigclass").options[window.document.getElementById("bigclass").selectedIndex].text 获取数据库中的id window.document.getElementById("bigclass").value 获取select组分配的索引id window.docume…

Java File类void deleteOnExit()方法(带示例)

文件类void deleteOnExit() (File Class void deleteOnExit()) This method is available in package java.io.File.deleteOnExit(). 软件包java.io.File.deleteOnExit()中提供了此方法。 This method is used to delete the file or directory when the virtual machine termi…

FreeRTOS队列

在实际应用中&#xff0c;我们会遇到一个任务或者中断服务需要和另一个任务进行消息传递&#xff0c;FreeRTOS提供了队列的机制来完成任务与任务、任务与中断之间的消息传递。 0x01 队列简介 队列是为了任务与任务、任务与中断之间的通信而准备的&#xff0c;可以在任务与任务…

括号配对问题(C)

描述 现在&#xff0c;有一行括号序列&#xff0c;请你检查这行括号是否配对。 输入 第一行输入一个数N&#xff08;0<N<100&#xff09;,表示有N组测试数据。后面的N行输入多组输入数据&#xff0c;每组输入数据都是一个字符串S(S的长度小于10000&#xff0c;且S不是空串…

剧情介绍:“阿甘正传”

阿甘是个智商只有75的低能儿。在学校里为了躲避别的孩子的欺侮&#xff0c;听从一个朋友珍妮的话而开始“跑”。他跑着躲避别人的捉弄。在中学时&#xff0c;他为了躲避别人而跑进了一所学校的橄榄球场&#xff0c;就这样跑进了大学。阿甘被破格录取&#xff0c;并成了橄榄球巨…

java 方法 示例_Java集合syncedList()方法与示例

java 方法 示例集合类syncList()方法 (Collections Class synchronizedList() method) synchronizedList() method is available in java.util package. syncList()方法在java.util包中可用。 synchronizedList() method is used to return the synchronized view of the given…

FreeRTOS信号量---二值信号量

信号量可以用来进行资源管理和任务同步&#xff0c;FreeRTOS中信号量又分为二值信号量、计算型信号量、互斥信号量和递归互斥信号量。 0x01 二值信号量 二值信号量其实就是一个只有一个队列项的队列&#xff0c;这个特殊的队列要么是满的&#xff0c;要么是空的&#xff0c;任…

Linux 上 rpm包管理工具的基本使用

查询是否安装某个包&#xff1a;rpm -q 包名查询所有已安装的包&#xff1a;rpm -q a查询未安装包的文件信息&#xff1a;rpm -qilp 未安装的包安装包&#xff1a;rpm -i 包测试安装包&#xff1a;rpm -i test 包删除包&#xff1a;rpm -e 包名测试删除包&#xff1a;rpm -e te…

ios 内存使用陷阱

在iphone开发过程中&#xff0c;代码中的内存泄露我们很容易用内存检测工具leaks 检测出来&#xff0c;并一一改之&#xff0c;但有些是因为ios 的缺陷和用法上的错误&#xff0c;leaks 检测工具并不能检测出来&#xff0c;你只会看到大量的内存被使用&#xff0c;最后收到didR…

FreeRTOS软件定时器

软件定时器允许设置一段时间&#xff0c;当设置的时间达到后就执行指定的功能函数&#xff0c;被软件定时器调用的功能函数叫做定时器的回调函数。软件定时器的回调函数是在定时器服务任务中执行的&#xff0c;所以一定不能在回调函数中调用任何阻塞任务的API函数&#xff0c;比…

Java类class isAssignableFrom()方法及示例

类class isAssignableFrom()方法 (Class class isAssignableFrom() method) isAssignableFrom() method is available in java.lang package. isAssignableFrom()方法在java.lang包中可用。 isAssignableFrom() method is used to check whether the class or an interface den…

关于 列表实例

wss3.0工具中有个列表实例项目。此项目的作用是在自定义网站或自定义字段时使用默认值。也就是定义其默认的数据。 格式详见微软msdn&#xff1a;http://msdn.microsoft.com/zh-cn/library/ms478860.aspx转载于:https://www.cnblogs.com/heavencloud/archive/2009/03/20/141793…

WP7之Application Bar控件

Microsoft.Phone.Shell命名空间中定义了ApplicationBar及其相关类&#xff08;ApplicationBarIconButton和ApplicationBarMenuItem&#xff09;&#xff0c;这些类派生自Object,并完全独立于常规Silverlight编程中的DependencyObject,UIElement和FrameworkElement类层次结构。A…

TomCat使用以及端口号被占用的处理方法

一.HTTP协议 什么是HTTP协议 HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是因特网上应用最为广泛的一种网络传输协议&#xff0c;所有的WWW文件都必须遵守这个标准。 HTTP请求 HTTP响应 2.如何处理端口被占用 方法一&#xff…

FreeRTOS事件标志组

使用信号量来同步的话&#xff0c;任务只能与单个事务或任务进行同步&#xff0c;有时候某个任务可能会需要与多个事件或任务进行同步&#xff0c;此时信号量就无能为力了&#xff0c;FreeRTOS为此提供了一个可选的解决方法&#xff0c;那就是事件标志组。 0x01 事件标志组 事…

FusionCharts等产品简介

以前做柱状图、饼形图等图表都是根据数据绘制出来的静态图&#xff0c;偶然看到别人的一套系统&#xff0c;居然可以让柱状图的柱子动画般的逐个出现&#xff0c;效果还是很不错的。不要跟我抬杠说不就是展现数据嘛&#xff0c;静态图表有什么不好&#xff0c;要知道用户一般可…

c#foreach循环_C#| 使用foreach循环打印整数数组

c#foreach循环Given an integer array and we have to print its elements using "foreach loop" in C#. 给定一个整数数组&#xff0c;我们必须在C&#xff03;中使用“ foreach循环”打印其元素 。 Syntax for foreach loop: foreach循环的语法&#xff1a; fore…

Eclipse和Tomcat绑定并且将上传资源到Tomcat上

步骤如下&#xff1a; 创建一个Dynamic Web Project&#xff08;图一&#xff09; Target runtime 选择Apache Tomcat v7.0版本&#xff08;图二&#xff09; 切记要选择 v7.0 和2.5 &#xff08;若没有图二选项见图三&#xff09; 然后&#xff0c;点击window --> Prefer…

浅析.NET平台编程语言的未来走向

在去年的PDC2008召开期间&#xff0c;微软逐步公开了围绕.NET和编程语言的很多想法&#xff0c;据此我们可以饶有兴趣地对.NET的未来预测一番。 .NET平台以运行在通用语言运行时(Common Language Runtime&#xff0c;CLR)上的C#和VB.NET作为开端。CLR是通用语言架构(Common Lan…

FreeRTOS任务通知

从v8.2.0版本开始&#xff0c;FreeRTOS新增了任务通知这个功能&#xff0c;可以使用任务通知来代替信号量、消息队列、事件标志组等这些东西&#xff0c;使用任务通知的话效率会更高。 任务通知在FreeRTOS是一个可选的选项&#xff0c;要使用任务通知的话就需要将宏configUSE_T…