您的位置:首页 > 编程语言 > C语言/C++

C++ set and multiset

2016-09-07 09:51 274 查看
简单来说 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++-set