C++ STL学习之八:关联式容器set深入学习

  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参数定义:

  1. set<int,greater<int>> col1;  
此时,排序准则就是型别的一部分。型别系统确保只有排序准则相同的容器才能被合并。

2、以构造函数参数定义。

这种情况下,同一个型别可以运用不同的排序准则,而排序准则的初始值或状态也可以不同。如果执行期才获得排序准则,而且需要用到不同的排序准则,这种方式可以派上用场。

赋值操作两端的容器必须具有相同的型别,但是比较准则本身可以不同,但是其型别必须相同。如果比较准则的不同,准则本身也会被赋值或交换。

set提供的插入函数:

  1. pair<iterator,bool> insert(const value_type& elem);   
  2. iterator  insert(iterator pos_hint, const value_type& elem);   
multiset提供的插入函数:

  1. iterator  insert(const value_type& elem);   
  2. iterator  insert(iterator pos_hint, const value_type& elem);  
返回值型别不同的原因是set不允许元素重复,而multiset允许。当插入的元素在set中已经包含有同样值的元素时,插入就会失败。所以set的返回值型别是由pair组织起来的两个值:

第一个元素返回新元素的位置,或返回现存的同值元素的位置。第二个元素表示插入是否成功。

set的第二个insert函数,如果插入失败,就只返回重复元素的位置!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值