Set和Multisets
set和multiset会根据特定的排序准则,自动将元素排序。两者不同在于multisets允许元素重复而set不允许。
1.set和multiset的操作函数
生成、复制和销毁
set c //产生一个空的set/multiset,其中不含任何元素set c(op) //以op为排序准则,产生一个空的set/mulitsetset c1(c2) //产生某个set/multiset的副本,所有元素均被复制set c(beg,end) //以区间[beg;end)内的元素产生一个set/multisetset c(beg,end,op) //以op为排序准则,利用[beg;end]内的元素生成一个set/multisetc.~set() //销毁所有元素,释放内存
其中set可为下列形式:
set//一个set,以less<>(operator<)为排序准则set //一个set,以op为排序准则multiset //一个multiset,以less<>(operator<)为排序准则multiset //一个multiset,以op为排序准则
特殊的搜寻函数
count(elem) //返回“元素值为elem”的元素个数find(elem) //返回"元素值为elem"的第一个元素的位置,如果找不到就返回end()lower_bound(elem) //返回elem的第一个可安插位置,也就是“元素值>=elem”的第一个元素位置upper_bound(elem) //返回elem的最后一个可安插位置,也就是“元素值>elem”的第一个元素位置equal_range(elem) //返回elem可安插的第一个位置和最后一个位置,也就是“元素值==elem”的元素区间
下面是后面三个函数的一个例子
1 #include2 #include 3 using namespace std; 4 5 int main() 6 { 7 set c; 8 c.insert(1); 9 c.insert(2);10 c.insert(4);11 c.insert(5);12 c.insert(6);13 cout<<"lower_bound(3): "<<*c.lower_bound(3)<
赋值
set和multiset只提供所有容器都提供的基本赋值操作
这些操作函数中,赋值操作的两端容器必须具有相容型别,而“比较准则”本身可以不同。如果准则不同,准则本身也会被赋值或交换
c1=c2 //将c2中所有元素赋值给c1c1.swap(c2) //将c1和c2的元素交换swap(c1,c2) //同上,此为全局函数
元素的安插和移除
c.insert(elem) //安插一份elem副本,返回新元素位置c.insert(pos,elem) //安插一份elem副本,返回新元素位置(pos只是个提示)c.insert(beg,end) //将区间[beg;end)内所有元素的副本安插到c(无返回值)c.erase(elem) //移除“与elem相等”的所有元素,返回被移除的元素个数c.erase(pos) //移除迭代器pos锁指位置上的元素,无返回值c.erase(beg,end) //移除区间[beg;end)内所有元素,无返回值c.clear() //移除全部元素,将整个容器清空
因为set的元素不可以重复,因此安插动作可能会失败。为此set提供了如下接口来判断安插动作是否成功:
pairinsert(const value_type& elem);
其中pair结构中second成员表示安插是否成功,first成员返回新元素的位置。
因为对迭代器操作而言,set和multiset所有元素都被视为常数,因此无法对其元素调用任何变动性算法。例如:remove()(因为remove()算法实际上是以一个参数值覆盖被移除的元素)。
如果要移除元素,只能使用它们所提供的成员函数。
2.set和multiset运用实例
1 #include2 #include 3 #include 4 using namespace std; 5 6 int main() 7 { 8 typedef set > IntSet; 9 IntSet coll1;10 coll1.insert(4);11 coll1.insert(3);12 coll1.insert(5);13 coll1.insert(1);14 coll1.insert(6);15 coll1.insert(2);16 coll1.insert(5);17 IntSet::iterator pos;18 for(pos=coll1.begin();pos!=coll1.end();++pos)19 cout<<*pos<<' ';20 cout< status=coll1.insert(4);22 if(status.second)23 cout<<"4 inserted as element "< <