C++ set and multiset

蝸牛一步一步往上爬發表於2016-09-07

簡單來說 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

相關文章