1. 简介
unordered_multimap是一种关联式容器,键值对(key, value)允许重复;增加、修改和查询具有线性的时间复杂度,其存储结构为哈希;元素的存储并未按照特定的顺序,而是被组织到桶中,在哪个桶中取决于其散列值;
头文件和定义
#include <unordered_map>
template<
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_multimap;
2. 初始化
unordered_multimap的初始化方法如下所示
/*
* @brief: unordered_map
* @compile: g++ -g unordered_multimap_main.cc -o d -std=c++11
* @author: your name
* @date: 2023/03/31
* @lastEditorDate:
*/
#include <iostream>
#include <unordered_map>
#include <string>
#include <iterator>
#include <functional>
using sstring = std::string;
void printEnd(int32_t n)
{
for(int32_t i = 0; i < n; i++){
std::cout<<std::endl;}
}
std::function<void(int32_t)> e = printEnd;
template<typename T>
void showInfo(T &t)
{
for(const auto& au : t)
{
std::cout<<"["<<au.first<<" ,"<<au.second<<"]; ";
}
}
int main(int argc, char *argv[])
{
//直接初始化
std::unordered_multimap<sstring, sstring> un_m1{
{
"1", "c"}, {
"3", "c++"}, {
"3", "c++"}, {
"3", "c++"}, {
"5", "matlab"}, {
"7", "linux"}, {
"10", "Rust"}};
std::cout<<"[un_m1]";e(1);
showInfo(un_m1);e(2);
std::unordered_multimap<sstring, sstring> un_m2;
un_m2.insert(std::make_pair("class_1", "student"));
un_m2.insert(std::make_pair("class_1", "teacher"));
un_m2.emplace(std::make_pair("class_2", "student"));
un_m2.insert(std::make_pair("class_2", "teacher"));
std::cout<<"[un_m2]";e(1);
showInfo(un_m2);e(2);
//拷贝初始化
std::unordered_multimap<sstring, sstring> un_m3 = un_m2;
std::cout<<"[un_m3]";e(1);
showInfo(un_m2);e(1);
return 0;
}
输出
[un_m1]
[10 ,Rust]; [7 ,linux]; [5 ,matlab]; [3 ,c++]; [3 ,c++]; [3 ,c++]; [1 ,c];
[un_m2]
[class_2 ,teacher]; [class_2 ,student]; [class_1 ,teacher]; [class_1 ,student];
[un_m3]
[class_2 ,teacher]; [class_2 ,student]; [class_1 ,teacher]; [class_1 ,student];
3. 使用
其支持的操作与unordered_map大部分一样,但是有以下几点是不同的;
- unordered_multimap不支持 insert_or_assign try_emplace,数据允许重复,都可以写入进去
- unordered_multimap不支持 operator[]和at,数据是允许重复的,通过下标无法锁定对应元素
unordered_multimap元素的访问
示例
int main(int argc, char *argv[])
{
//直接初始化
std::unordered_multimap<sstring, sstring> un_m1{
{
"class_1", "student"}, {
"class_1", "teacher"}, {
"class_1", "scoure"}, \
{
"class_2", "student"}, {
"class_2", "teacher"}, {
"class_2", "scoure"}, \
{
"class_3", "student"}, {
"class_3", "teacher"}, {
"class_3", "scoure"}, \
{
"class_4", "student"}, {
"class_4", "teacher"}, {
"class_4", "scoure"}};
std::cout<<"[un_m1]";e(1);
showInfo(un_m1);e(2);
//1.通过find()和count()来遍历元素
auto iter = un_m1.find("class_3");
for(size_t i = 0;i<un_m1.count("class_3"); i++)
{
std::cout<<"["<<iter->first<<", "<<iter->second<<"]; ";
std::advance(iter, 1);
}
e(2);
//2.通过equal_range()遍历元素
auto equal_iter = un_m1.equal_range("class_2");
auto iter_begin = equal_iter.first;
while(iter_begin != equal_iter.second)
{
std::cout<<"["<<iter_begin->first<<", "<<iter_begin->second<<"]; ";
std::advance(iter_begin, 1);
}
e(1);
return 0;
}
输出
[un_m1]
[class_4 ,scoure]; [class_4 ,teacher]; [class_4 ,student]; [class_3 ,scoure]; [class_3 ,teacher]; [class_3 ,student]; [class_2 ,scoure]; [class_2 ,teacher]; [class_2 ,student]; [class_1 ,scoure]; [class_1 ,teacher]; [class_1 ,student];
[class_3, scoure]; [class_3, teacher]; [class_3, student];
[class_2, scoure]; [class_2, teacher]; [class_2, student];