Chapter 16.關聯容器multiset

multiset簡介
multiset與set類似,但是其允許相同的值,應用舉例:比如求某個範圍內的最大最小值(值可以重複)
與set的區別在於,insert()一定會插入值;erase(element_value)會刪除所有相同元素值的元素
multiset模板
template < class Key, class Compare = less<Key>,
           class Allocator = allocator<Key> > class multiset;

Member functions

(constructor) Construct multiset 
(destructor) Multiset destructor
operator= Copy container content
constructor
1.explicit multiset ( const Compare& comp = Compare(),
                    const Allocator& = Allocator() );//empty version
2.template <class InputIterator>
multiset ( InputIterator first, InputIterator last,
             const Compare& comp = Compare(), const Allocator& = Allocator() );//iterator version
3.multiset ( const multiset<Key,Compare,Allocator>& x );//copy version

eg:
bool fncomp (int lhs, int rhs) {return lhs<rhs;}
struct classcomp {
  bool operator() (const int& lhs, const int& rhs) const
  {return lhs<rhs;}
};
multiset<int,classcomp> ms;                // class as Compare
bool(*fn_pt)(int,int) = fncomp;
multiset<int,bool(*)(int,int)> ms(fn_pt); // function pointer as Compare
Iterators:

begin Return iterator to beginning
end Return iterator to end
rbegin Return reverse iterator to reverse beginning
rend Return reverse iterator to reverse end
eg:
for (auto iter = ms.rbegin(); iter != ms.rend(); ++iter)
{
	cout<<*iter<<'\t';
}
//same as follow one
#include <algorithm>
#include <iterator>
copy(ms.begin(),ms.end(),ostream_iterator<string>(cout,"\t")); 
Capacity:
empty Test whether container is empty
size Return container size
max_size Return maximum size
Modifiers:
insert Insert element 
erase Erase elements
swap Swap content
clear Clear content
insert 
1.iterator insert ( const value_type& x );//if there are same value elements, all elements removed in this version
2.iterator insert ( iterator position, const value_type& x );
3.template <class InputIterator>
void insert ( InputIterator first, InputIterator last );

eg:
string str[]={"hello","C++","Java","C"};
vector<string> vStr(str,str+4);
multiset<string> ms;

//insert key_value version
ms.insert("1");
ms.insert("1");
ms.insert("3");
ms.insert("1");
auto iter=vStr.begin();
advance(iter,2);

//insert iterator version
ms.insert(vStr.begin(),iter);

//insert (iterator position, key_value)
ms.insert(ms.begin(),"oops");

for (auto iter = ms.begin(); iter != ms.end(); ++iter)
{
	cout<<*iter<<'\t';
}
cout<<endl;
//copy(ms.begin(),ms.end(),ostream_iterator<string>(cout,"\t")); 
Output:
1       1       1       3       C++     hello   oops
erase
1.void erase ( iterator position );
2.size_type erase ( const key_type& x );
3.void erase ( iterator first, iterator last );

eg:
auto cnt=ms.erase("1");
cout<<"-------cnt="<<cnt<<endl;
Output:
-------cnt=3
3       C++     hello   oops
其他兩種分別是 iterator position 和 iterator range的版本就不寫例子了
Observers:
key_comp Return comparison object
value_comp Return comparison object
//這兩個不怎麼用就不寫了
Operations:
find Get iterator to element
count Count elements with a specific key//return element appear times
lower_bound Return iterator to lower bound
upper_bound Return iterator to upper bound
equal_range Get range of equal elements
find

//if have no x in container,return multiset::end, else return first one element iterator in container, if have same element you can use equal_range to return a iterator range

iterator find ( const key_type& x ) const;

count
size_type count ( const key_type& x ) const;
equal_range
eg:
//pair<multiset<int>::iterator,multiset<int>::iterator> ret; 
auto ret=ms.equal_range("1"); 
for (auto iter = ret.first; iter != ret.second; ++iter) 
{ 
 cout<<"**********"<<*iter<<'\t'; 
}
//lower_bound >=[包括他在內的他的iterator]
//upper_bound >[比他大的下一個iterator]

eg:
auto low=ms.lower_bound("0"); 
auto up=ms.upper_bound("2");
cout<<*low<<endl;//返回“1”
cout<<*up<<endl; //upper_bound指向了大於“2”的“3”
ms.erase(low,up);
Output://1 1 1 被刪除了
3
3 C++ hello oops

Allocator:
get_allocator

//same as before like list etc. omit it
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章