C++ set and multiset

简单来说 set 是一组有序数的集合,集合里的元素没有重复的,而 multiset 则允许元素重复。因此multiset在一些操作上要注意和set的区别。

定义

template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;

template < class T,                        // multiset::key_type/value_type
           class Compare = less<T>,        // multiset::key_compare/value_compare
           class Alloc = allocator<T> >    // multiset::allocator_type
           > class multiset;
 set<int> setNum;// 定义一个包含int型的set
 multiset<int> msetsNum; //定义一个包含int型的multiset

默认情况下,是按less比较符号(在functional头文件)比较元素大小的,所以set里元素是从小到大排序的;如果想要从大到小排序,可以使用greater:

 set<int, greater<int>> setNum;// 定义一个包含int型的set
 multiset<int, greater<int>> msetsNum; //定义一个包含int型的multiset

插入元素和删除元素

插入单个元素的操作都一样:

single element (1)  
iterator insert (const value_type& val);
iterator insert (value_type&& val);
with hint (2)   
iterator insert (const_iterator position, const value_type& val);
iterator insert (const_iterator position, value_type&& val);
range (3)   
template <class InputIterator>
  void insert (InputIterator first, InputIterator last);
initializer list (4)    
void insert (initializer_list<value_type> il);

删除元素的时候注意了,删除元素可以指定要删除的元素值或者迭代器。对于set来说,每个元素不重复,指定删除元素值或者迭代器都一样;但是对于multiset来说,指定元素的值会所有等于该元素的值删除掉,而指定迭代器只会把该迭代器指定的元素删除掉!

  cout << "multiset set erase example" << endl;
  multiset<int, greater<int>> msets{ 1, 1, 3, 3, 2, 2 };
  for_each( msets.begin(), msets.end(),
            []( int i ) {cout << i << " "; } );
  cout << endl;

  //erase the first element
  msets.erase( msets.begin() );
  for_each( msets.begin(), msets.end(),
            []( int i ) {cout << i << " "; } );
  cout << endl;

  //erase the last element
  msets.erase( --msets.end() );//or msets.erase( std::prev(msets.end()) )  or msets.erase( (++msets.rbegin()).base() );
  for_each( msets.begin(), msets.end(), []( int i ) {cout << i << " "; } );
  cout << endl; 

  //erase the 2
  msets.erase( 2 );
  for_each( msets.begin(), msets.end(),
            []( int i ) {cout << i << " "; } );
  cout << endl;

输出:

3 3 2 2 1 1
3 2 2 1 1
3 2 2 1
3 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值