一、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 << " ";
}
}