STL set、multiset 学习笔记

一、set、multiset 的能力:

set、multiset采用平衡二叉树完成,set中的元素不允许重复,multiset允许重复;

set、multiset不提供直接存取元素的任何函数操作;

通过iterator 进行元素简介存取,有一个限制:从迭代器角度来看,元素值是常数;

二、set、multiset 的形式:

set<Elem>  一个set,以less<>(operator <)为排序准则

set<Elem,OP>一个set,以为排序准则

multiset<Elem> 一个multiset,以less<>(operator <)为排序准则

multiset<Elem,OP>一个multiset,以为排序准则


OP如:less<int>、greater<int>等

注:排序的不同,也会纳为两个对象是否相等的判断;

三、set、multiset 相关操作:

1、set、multiset 非变动性操作:

c.size();

c.empty();

c.max_size();

c1==c2;

2、set、multiset 搜寻操作函数:

count ( elem );返回“元素值为elem”的元素个数;

find ( elem );返回“元素值为elem”的第一个元素,如果找不到就返回end();

lower_bound( elem );返回elem的第一个可安插位置;

upper_bound( elem );返回elem的最后一个可安插位置;

equal_range( elem );返回elem的第一个可安插位置和最后一个可安插位置

3、set、multiset 的赋值操作:

c1=c2;

c1.swap(c2);

swap ( c1,c2 );

4、set、multiset 的迭代器相关函数:

c.begin();指向第一个元素;

c.end();指向最后一个元素;

c.rbegin()指向逆向第一个元素;

c.rendl();指向逆向最后一个元素;

5、set、multiset 元素安插和移除:

c.insert( elem );插入elem的副本,返回新元素的位置;

c.insert( pos, elem );以pos为起点,搜寻插入位置,插入elem,返回新元素位置;

c.insert( beg , end);将[ beg ,end ]内所有元素插入到c,无返回值;

c.erase( elem );移除与elem相等的所有元素,返回被移除元素的个数;

c.erase( pos );移除迭代器跑pos上的元素,无返回值;

c.erase( beg ,end );移除[beg, end ]内所有元素,无返回值;

c.clear();移除所有元素,将容器清空;


四、重点讲解:

1、流迭代器(stream iterators):用于读写stream的迭代器;

istream_iterator< string > ( cin )产生一个标准输入流,读取数据的stream iterator;

istream_iterator< string > ()调用istream 的default构造函数,产生一个代表“流结束符号”的迭代器,它代表的意义是:你不能再从中读取任何东西;

ostream_iterator< string > (cout ,"\t")产生一个output stream iterator ,透过operator<<向cout写入string,cout 之后的第二个参数(可有可无)被用来作为元素之间的分隔符。

如:copy(istream_iterator< string > ( cin ),istream_iterator< string > ( ),back_inserter( coll ));

copy( coll.begin() , coll.end() ,ostream_iterator< string > (cout ,"\t")); //输入[ beg , end ]间所有的元素

unique_copy( coll.begin() , coll.end() ,ostream_iterator< string > (cout ,"\t")); //输入[ beg , end ]间所有的元素,消除毗邻元素

copy();包含于算法头文件 algorithm

2、pair的应用:pair广泛应用于set、multiset中:

第一、pair结构中的second成员表示安插是否成功;

第二、pair结构中的first成员返回新元素的位置,或返回现存同值元素的位置。其他任何条件下,函数都返回新元素位置(如果set已经内含同值元素,则返回同元素的位置)。

std::set< double >c;
...
if( c.insert( 3.3).second){
	std::cout<<"  3.3 inserted"<<std::endl;
}
else{
	std::cout<<" 3.3 already exists"<<std::endl;
}
std::pair < std::set< double >,bool>  status;
status= c.insert(value);
if( status.second){
	std::cout<<value<<"  inserted as elem"<<std::endl;
}
else{
	std::cout<<value<<" already exists"<<std::endl;
}
std::cout<<std::distance( c.begin(), status.first)+1<<std::endl;


五、代码实例:

#include<iostream>
#include<set>

using namespace std;
void main()
{
	typedef set<int,less<int>> IntSet;
	IntSet coll;
	coll.insert(1);
	coll.insert(0);
	coll.insert(-1);
	coll.insert(4);
	coll.insert(7);


	IntSet::iterator pos;
	for(pos=coll.begin() ; pos != coll.end() ; ++pos)
	{
		cout << *pos << " ";
	}
	cout << endl;

	pair<IntSet::iterator,bool> status=coll.insert(4);

	if(status.second){
		cout<< "4 inserted as elem"
			<< distance(coll.begin(),status.first)+1
			<< endl;
	}
	else
	{
		cout << "4 aready exists" << endl;
	}
	coll.erase(coll.find(4));

	for(pos=coll.begin() ; pos != coll.end() ; ++pos)
	{
		cout << *pos << " ";
	}
}





  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值