1. set和multiset的头文件是#include<set>,他们的区别是
(1)set不能有重复的元素,而multiset可以有重复的元素。
(2)如果定义的是multiset类型的元素时,当删除元素a,那么所有的a都会被删除。
(3)统计元素个数,s.count(a);时,set能返回0或1,而multiset是可以返回多个的。
2.反向遍历则用反向迭代器,例如定义int型的反向迭代器:
set<int>::reverse_iterator rit;
For(rit=s.rbegin();rit!=s.rend();it++)
cout<<*rit<<” ”;
此时的s.rbegin()相当于s.end()。s.rend()相当于s.begin()。
3. find()函数,返回一个指向被查找到元素的迭代器,如果找不到的话就返回s.end()。例如:
set<int>::iterator it;
It=s.find(5);
If(it!=s.end())
cout<<*it<<endl;
Else
cout<<”not find”<<endl;
4. 对于结构体的,要运算符重载,例如:
#include<iostream>
#include<string>
#include<set>
using namespace std;
struct Info{
string name;
float score;
bool operator < (const Info &a)const
{
return a.score<score;
}
};
int main()
{
set<Info> s;
Info info;
info.name="Jack";
info.score=80;
s.insert(info);
info.name="Tom";
info.score=20;
s.insert(info);
info.name="Nacy";
info.score=60;
s.insert(info);
info.name="Elano";
info.score=75;
s.insert(info);
info.name="David";
info.score=90;
s.insert(info);
set<Info>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<(*it).name<<":"<<(*it).score<<endl;
return 0;
}
5. set的元素是用insert函数插入,插入之后自动排序。
ms.insert("abc");
ms.insert("123");
ms.insert("111");
ms.insert("aaa");
ms.insert("123");
ms.insert("bbb");
multiset<string>::iterator it;
for(it=ms.begin();it!=ms.end();it++)
cout<<*it<<” ”;
输出的结果为:111 123 123 aaa abc bbb。
6. 删除一个元素的函数为erase,例如:
multiset<string> ms;
ms.insert("abc");
ms.insert("123");
ms.insert("111");
ms.insert("aaa");
ms.insert("123");
ms.insert("bbb");
int n=ms.erase("123");//此时n=删除的元素的个数,也可以不定义
cout<<"total deleted:"<<n<<endl;//n,直接用ms.erase(“123”)即可。
cout<<"all elements after deleted:"<<endl;
for(it=ms.begin();it!=ms.end();it++)
cout<<*it<<endl;
7. set的初始化是用ms.insert()函数。