C++ set and multiset
2016-09-07 09:51
274 查看
简单来说 set 是一组有序数的集合,集合里的元素没有重复的,而 multiset 则允许元素重复。因此multiset在一些操作上要注意和set的区别。
默认情况下,是按less比较符号(在functional头文件)比较元素大小的,所以set里元素是从小到大排序的;如果想要从大到小排序,可以使用greater:
删除元素的时候注意了,删除元素可以指定要删除的元素值或者迭代器。对于set来说,每个元素不重复,指定删除元素值或者迭代器都一样;但是对于multiset来说,指定元素的值会所有等于该元素的值删除掉,而指定迭代器只会把该迭代器指定的元素删除掉!
输出:
定义
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
相关文章推荐
- STL set and multiset
- 转自http://blog.sina.com.cn/daylive——C++ STL set&multiset
- C++之set和multiset容器初学
- c++ map/multimap,set/multiset的使用(续)
- c++ map/multimap,set/multiset的用法及比较
- set and multiset
- C++ set/multiset
- c++set和multiset的操作
- C++之STL(5)之 set 与 multiset
- C++STL中,map/multimap,set/multiset 和vector的排序
- STL学习笔记4--set and multiset
- C++ set(集)和multiset(多集)
- C++ set和multiset的插入
- c++在用set和multiset时遇到的一个bug
- c++ associative container: map and set
- C++的STL模板set,multiset,map,multimap,deque,list,stack,queue和priority_queue
- 【学习笔记】C++高级程序设计:STL:Set 和 Multiset
- C++ Set & MultiSet
- (STL之set与multiset)SPOJ - Ada and Field(易)
- Effective STL 22 Avoid in-place key modification in set and multiset