定义
类似于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 << " " // 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());