简单来说 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