set和map的最大不同就是set是单值,而map是键值对, 当然set也可以理解成键值对相等的特殊键值对。multiset和set有什么区别呢?主要值能不能重复的问题,如果可以保存多个相同值的话就使用multiset否则就使用set。因为插入的时候,它们分别调用的是insert和unique_insert;同理,map和multimap也是这个意思。
和所有关联式容器类似,通常使用平衡二叉树完成。事实上,set和multiset通常以红黑树实作而成。自动排序的优点是使得搜寻元素时具有良好的性能,具有对数时间复杂度。但是造成的一个缺点就是:不能直接改变元素值。因为这样会打乱原有的顺序。改变元素值的方法是:先删除旧元素,再插入新元素。存取元素只能通过迭代器,从迭代器的角度看,元素值是常数。
程序实例
#include<iostream>
#include<set>
#include<iterator>
using namespace std;
int main(int argc,char *argv[])
{
set<int,greater<int> > s1;
set<int,greater<int> > s2;
for(int i=1;i<7;i++)
{
s1.insert(i);
s2.insert(i);
}
if(s1==s2)//要比较s1和s2,就必须保证它们按相同的顺序排序
cout<<"c1==c2"<<endl;
else
cout<<"c1!=c2"<<endl;
s1.clear();
s1.insert(8);
s1.insert(1);
s1.insert(9);
s1.insert(0);
s1.insert(159);
s1.insert(81);
copy(s1.begin(),s1.end(),ostream_iterator<int>(cout," "));
cout<<endl<<endl;
pair<set<int,greater<int> >::iterator,bool> status=s1.insert(4);
if(status.second)
cout<<"4 is inserted as element"<<distance(s1.begin(),status.first)+1<<endl;
else
cout<<"4 already exists in s1"<<endl;
copy(s1.begin(),s1.end(),ostream_iterator<int>(cout," "));
cout<<endl<<endl;
set<int> s3(s1.begin(),s1.end());//注意这里s1是按<span style="font-family: Arial;">降</span>序排列的,s3是按默认的<span style="font-family: Arial;">升</span>序排列的
copy(s3.begin(),s3.end(),ostream_iterator<int>(cout," "));
cout<<endl<<endl;
return 0;
}
shenhuayu@shenhuayu-VirtualBox ~/src $ g++ stltest.cpp -g -o mystltest
shenhuayu@shenhuayu-VirtualBox ~/src $ ./mystltest
c1==c2
159 81 9 8 1 0
4 is inserted as element5
159 81 9 8 4 1 0
0 1 4 8 9 81 159
有两种方式可以定义排序准则:
1、以template参数定义:
- set<int,greater<int>> col1;
2、以构造函数参数定义。
这种情况下,同一个型别可以运用不同的排序准则,而排序准则的初始值或状态也可以不同。如果执行期才获得排序准则,而且需要用到不同的排序准则,这种方式可以派上用场。
赋值操作两端的容器必须具有相同的型别,但是比较准则本身可以不同,但是其型别必须相同。如果比较准则的不同,准则本身也会被赋值或交换。set提供的插入函数:
- pair<iterator,bool> insert(const value_type& elem);
- iterator insert(iterator pos_hint, const value_type& elem);
- iterator insert(const value_type& elem);
- iterator insert(iterator pos_hint, const value_type& elem);
第一个元素返回新元素的位置,或返回现存的同值元素的位置。第二个元素表示插入是否成功。
set的第二个insert函数,如果插入失败,就只返回重复元素的位置!