一、基本介绍
Multimap是C++标准库中的容器之一,是一种关联式容器,其中动态存储数据,并能够根据键值对数据进行快速访问。与普通的Map不同的是,Multimap中可以同时存在相同的键值。Multimap使用二叉搜索树实现,比较的依据是键值对的比较结果。
一个Multimap包含了很多键值对,其中每一个键值对可以看作是一个节点。可以使用关键字来查找值。关键字可以有重复值,也就是说多个键值对可以有相同的关键字。值可以被修改,但是键不会被修改。Multimap模板定义在头文件
#include <iostream> #include <map> int main() { std::multimapmymm; mymm.insert(std::pair ('x',10)); mymm.insert(std::pair ('y',20)); mymm.insert(std::pair ('z',30)); mymm.insert(std::pair ('z',40)); mymm.insert(std::pair ('z',50)); std::cout << "mymm contains:\n"; for (auto elem : mymm) std::cout << elem.first << " => " << elem.second << '\n'; return 0; }
二、插入元素
Multimap支持两种插入元素的方式——insert和emplace。其中,insert接受一个键值对作为参数,如果Multimap中已经存在相同的键,则插入新值,如果不存在,则插入整个键值对。emplace则直接接受键和值,然后在Multimap中进行排序并插入。
除了上述两种方法,Multimap还可以通过直接访问其迭代器来进行插入操作。
使用insert进行插入操作:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.insert(std::pair<char,int>('a',10)); mymm.insert(std::pair<char,int>('b',20)); mymm.insert(std::pair<char,int>('c',30)); for (auto elem : mymm) std::cout << elem.first << " => " << elem.second << '\n'; return 0; }
使用emplace进行插入操作:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); for (auto elem : mymm) std::cout << elem.first << " => " << elem.second << '\n'; return 0; }
使用迭代器进行插入操作:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; auto it = mymm.emplace('a',10); mymm.emplace_hint(it,'b',20); mymm.emplace_hint(mymm.end(),'c',30); for (auto elem : mymm) std::cout << elem.first << " => " << elem.second << '\n'; return 0; }
三、查找元素
Multimap支持多种查找元素的方式,其中find、count、equal_range和lower_bound是比较常用的。其中,find接受一个键,返回Multimap中指向对应元素的迭代器。如果Multimap中不存在该键,则返回Multimap的end迭代器。count接受一个键,返回Multimap中该键对应元素的个数。equal_range则返回一个pair对象,其中first是指向Multimap中首个匹配元素的迭代器,second是指向Multimap中最后一个匹配元素之后的迭代器。lower_bound也返回与当前键匹配的第一个元素的迭代器。
使用find查找元素:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); auto it = mymm.find('b'); std::cout << "Key found: " << it->first << " = " << it->second << '\n'; return 0; }
使用count查找元素:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); int count = mymm.count('b'); std::cout << "Number of values with key 'b': " << count << '\n'; return 0; }
使用equal_range查找元素:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); auto range = mymm.equal_range('b'); for (auto it = range.first; it != range.second; it++) std::cout << it->first << " => " << it->second << '\n'; return 0; }
使用lower_bound查找元素:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); auto it = mymm.lower_bound('b'); std::cout << "Key found: " << it->first << " = " << it->second << '\n'; return 0; }
四、删除元素
与插入元素类似,Multimap支持多种删除元素的方式,其中erase接受一个元素的迭代器,删除对应的元素。remove则接受一个键,删除该键对应的所有元素。
使用erase删除元素:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); auto it = mymm.find('b'); mymm.erase(it); for (auto elem : mymm) std::cout << elem.first << " => " << elem.second << '\n'; return 0; }
使用remove删除元素:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); mymm.emplace('b',40); mymm.erase('b'); for (auto elem : mymm) std::cout << elem.first << " => " << elem.second << '\n'; return 0; }
五、其他操作
Multimap支持许多其他的操作,包括size(返回Multimap中元素的数量)、empty(如果Multimap为空则返回true)、swap(交换两个Multimap中的元素)、clear(清除Multimap中的所有元素)等。
使用size获取Multimap中元素数量:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); std::cout << "The size of the Multimap is " << mymm.size() << '\n'; return 0; }
使用empty判断Multimap是否为空:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; std::cout << "The Multimap is " << (mymm.empty() ? "empty" : "not empty") << '\n'; return 0; }
使用swap交换两个Multimap中的元素:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm1; std::multimap<char,int> mymm2; mymm1.emplace('a',10); mymm1.emplace('b',20); mymm1.emplace('c',30); mymm2.emplace('x',40); mymm2.emplace('y',50); mymm1.swap(mymm2); for (auto elem : mymm2) std::cout << elem.first << " => " << elem.second << '\n'; return 0; }
使用clear清除Multimap中的所有元素:
#include <iostream> #include <map> int main() { std::multimap<char,int> mymm; mymm.emplace('a',10); mymm.emplace('b',20); mymm.emplace('c',30); mymm.clear(); std::cout << "The Multimap is " << (mymm.empty() ? "empty" : "not empty") << '\n'; return 0; }