类似于map,multimap也是存储两个元素之间的映射关系的容器,不相同的是,multimap的key值可以重复出现。另外和map、set一样,multimap的关键字类型也要具有严格弱序的定义。(补:通常不对关联容器使用泛型算法--<<C++ Primer>>)
创建空的容器:
std::multimap<char, int> first;
从一个范围构造:
std::multimap<char, int> second(first.begin(), first.end());
复制构造:
std::multimap<char, int> third(second);
添加自定义比较:
struct classcomp {
bool operator() (const char& lhs, const char& rhs) const{
return lhs<rhs;
}
};
std::multimap<char,int,classcomp> fourth;
添加元素使用成员函数insert
,有以下几种添加元素的形式:
std::multimap<char, int> mymultimap
版本一:添加单个元素
mymultimap.insert(std::pair<char, int>('a', 100));
mymultimap.insert({'b', 20});
//insert()返回指向当前新插入元素的迭代器
it = mymultimap.insert(std::pair<char, int>('c', 60));
版本二:从一个范围添加
std::multimap<char, int> hismultimap;
hismultimap.insert(mymultimap.begin(), mymultimap.find('c'));
版本三:在提示的(Hint)位置添加:
mymultimap.insert(it, std::pair<char, int>('d', 10));
遍历:
mymultimap.insert (std::pair<char,int>('a',10));
mymultimap.insert (std::pair<char,int>('b',20));
mymultimap.insert (std::pair<char,int>('b',150));
for(std::mymultimap<char, int>::iterator it = mymultimap.begin(); it != mymultimap.end(); ++it)
std::cout << (*it).first << "=>" << (*it).second << "\n"
// output:
// a=>10
// b=>20;
// b=>150;
查找:
方法一:利用成员函数find
和count
std::multimap<char, int> mymm;
mymm.insert (std::make_pair('x',10));
mymm.insert (std::make_pair('y',20));
mymm.insert (std::make_pair('z',30));
mymm.insert (std::make_pair('z',40));
auto nums = mymm.count('z'); //'z'的数量
auto iter = mymm.find('z'); //第一个'z'
while(nums--){
cout << iter->second << endl;
iter++;
}
方法二:利用成员函数lower_bound
和upper_bound
这两个函数都接受一个查找关键字,返回一个迭代器lower_bound
返回的迭代器指向第一个具有给定关键字的元素,upper_bound
返回的迭代器指向最后一个匹配给定关键字的元素之后的位置。如果查找元素不存在,两个函数返回的迭代器相等--指向一个不影响排序的关键字插入位置。
for(auto beg = mymm.lower_bound('z'), end = mymm.upper_bound('z'); beg != end; ++beg)
cout << beg->second << endl;
方法三:使用成员函数equal_range
euqal_range
接受一个查找关键字,返回一个迭代器pair
。若关键字存在,则第一个迭代器指向第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置。若未找到匹配元素,则两个迭代器都指向关键字可以插入的位置。
for(auto pos = mymm.equal_range('z'); pos.first != pos.second; ++pos.first)
cout << pos.first->second << endl;
使用erase
删除multimap中的元素,erase
有三种形式:
删除指定键值:mymm.erase(‘a‘)
,返回删除的元素数量
传入一个迭代器:
it = mymm.find('a');
mymm.erase(it);
传入两个迭代器,删除一定范围元素
mymm.erase(it, mymm.end());
原文:https://www.cnblogs.com/patrolli/p/11281736.html