当前位置:首页 > 编程笔记 > 正文
已解决

C++ STL - map 与 multimap用法和区别

来自网友在路上 175875提问 提问时间:2023-11-09 08:50:34阅读次数: 75

最佳答案 问答题库758位专家为你答疑解惑

目录

一、概述

二、用法

2.1、插入

2.2、拷贝与赋值

2.3、查找

2.4、删除

2.5、完整代码

三、其他成员类型


一、概述

map 与 multimap是存储key-value(键-值 对)类型的容器。不同之处在于:map只允许key与 value一一对应;multimap一个key可对应多个value;说白了map规定key值具有唯一性,而multimap不是。

上述使其不同之处,下面如果,不作特别说明,适用于map的都适用于multimap(见代码)

二、用法

2.1、插入

插入可以判断是否插入成功,完整代码见最后一节。下面代码中isInsertOK用于接受返回值,变量类型为:pair< map<vector<int>, int>::iterator, bool>;如果是新手还是像下面这样写一次;熟练以后,直接使用auto isInsertOK代替。

//声明,定义
std::map<int, std::string> m;
m[3] = "h1";
m[0] = "what";
// 构建 key-value
m.insert(std::pair<int, std::string>(2, "love you"));

2.2、拷贝与赋值

允许使用一个map初始化另一个map,如下代码,可以使用vecA初始化vecB。map也重载了等号,直接赋值。

map<vector<int>, int> vecB(vecA); //拷贝构造
map<vector<int>, int> vecC;
vecC = vecA;
vecC.swap(vecA);

2.3、查找

map中,用于查找功能的成员函数有很多,如下:

  • lower_bound("china");   //指向vecD中第一个 = 键值 “china”对应的元素
  • upper_bound("china");   //指向vecD中第一个 > 键值 “china”对应的元素
  • equal_range("china");    //指向vecD中第一个 >= 键值 “china”对应的元素
  • count("china");  //查找key = “china”键值对的个数
  • find("china");  //查找key = “china”对应键值对
 map<string, int> vecD;
// 你以为按照下面初始化 vecD,他的size会是5? 由于insert方法不能覆盖,所以我们将map 改成 multimap
vecD.insert(pair<string, int>((string)"china", 1));
vecD.insert(pair<string, int>((string)"china", 2));//拒绝插入
vecD.insert(pair<string, int>((string)"china", 3));//拒绝插入
vecD.insert(pair<string, int>((string)"english", 1));
vecD.insert(pair<string, int>((string)"english", 2));//拒绝插入multimap<string, int> vecE;
vecE.insert(make_pair((string)"china", 1));
vecE.insert(make_pair((string)"china", 1));//允许插入
vecE.insert(make_pair((string)"china", 3));//允许插入
vecE.insert(make_pair((string)"china", 4));//允许插入
vecE.insert(make_pair((string)"china", 5));//允许插入
vecE.insert(make_pair((string)"english", 1));
vecE.insert(make_pair((string)"english", 2));//允许插入
vecE.insert(make_pair((string)"america", 1));
vecE.insert(make_pair((string)"america", 2));//允许插入
vecE.insert(make_pair((string)"america", 3));//允许插入
cout << "multimap 初始化" << endl;
cout << "vecE所有元素"<<endl;
printfB(vecE);
//查找区间
multimap<string, int> ::iterator it1 = vecE.lower_bound("china");   //指向vecD中第一个等于键值 “china”对应的元素
multimap<string, int> ::iterator it2 = vecE.upper_bound("china");   //指向vecD中第一个大于键值 “china”对应的元素
cout << it1->first << " " << it1->second << endl;
cout << it2->first << " " << it2->second << endl;
// 等于 = lower_bound + upper_bound
pair<multimap<string, int>::iterator, multimap<string, int>::iterator > it3    = vecE.equal_range("china");
map<string, int>::iterator it4 = it3.first;
map<string, int>::iterator it5 = it3.second;//查找key = “china”键值对的个数
int iCount = vecE.count("china");//查找key = “china”对应键值对
multimap<string, int>::iterator it6 = vecE.find("china");

2.4、删除

可以删除multimap中key = "english"的 所有元素指定,直接调用erase函数。也可以删除指定地址范围内的元素,例如:vecE.erase(itBegin_, itEnd_);

multimap<string, int>::iterator itBegin = vecE.begin();
// 删除 vecE 前面三个元素 与 后面 三个元素
// 在改善特征点匹配算法中有实践
int index = 0;
int vecA_size = vecE.size();
//删除(自定义删除任何元素)
for (multimap<string, int>::iterator it_ = vecE.begin(); it_ != vecE.end(); )
{//<1>法1//vecE.erase(it_++);//<2>法2if ((0<=index)&&(index<=2)){it_ = vecE.erase(it_);//这样写,防止指针失效}else if (((vecA_size - 3) <= index) && (index <= (vecA_size - 1))){it_ = vecE.erase(it_);}else{it_++;}++index;
}//删除multimap中key = "english"的 所有 元素
vecE.erase("english");
cout << "vecE删除key = english的 所有 元素 " << endl;
printfB(vecE);//删除所有元素
multimap<string, int>::iterator itBegin_ = vecE.begin();
multimap<string, int>::iterator itEnd_ = vecE.end();
vecE.erase(itBegin_, itEnd_);
//bool isEmpty = vecE.empty();if (vecE.empty())
{cout << "vecE已经被清空" << endl;
}

2.5、完整代码

#include<opencv2/opencv.hpp>
#include<map>
#include<iostream>
#include <algorithm>    // std::sortusing namespace std;//打印函数可写成模板//打印函数 printfA
void printfA(map<vector<int>, int> vec_)
{for (std::map<std::vector<int>, int>::iterator it = vec_.begin(); it != vec_.end(); it++){std::cout << it->first[0] << "  " << it->first[1] << "  " << it->first[2] << "  " << it->second << std::endl;}cout << "容积 = " << vec_.size() << endl;
}//打印函数 printfB
void printfB(multimap<string, int> vec_)
{for (multimap<string, int>::iterator it = vec_.begin(); it != vec_.end(); it++){std::cout << it->first  << "  " << it->second << std::endl;}cout << "容积 = " << vec_.size() << endl;
}int main()
{//声明,定义std::map<int, std::string> m;m[3] = "h1";m[0] = "what";// 构建 key-valuem.insert(std::pair<int, std::string>(2, "love you"));std::cout << m[0].c_str() << std::endl;//这里数字 不是索引值了std::cout << m[3].c_str() << std::endl;std::cout << m[4].c_str() << std::endl;std::cout << m[2].c_str() << std::endl;   // 会产生一个新的元素,即m[2] = ""m[6] = string("slam2345");std::cout << m.size() << std::endl;       // 5//遍历for (std::map<int, std::string>::iterator it = m.begin(); it != m.end(); it++)std::cout << it->first << ", " << it->second.c_str() << std::endl;std::vector<int> pointTemp;std::map<std::vector<int>, int> vecA;for (int y = 0; y < 4; y++){for (int x = 0; x < 4; x++){pointTemp.push_back(y);pointTemp.push_back(x);pointTemp.push_back(x + y);//插入vecA.insert(std::pair<std::vector<int>, int>(pointTemp, (y * 4 + x + 1)));pointTemp.clear();}}printfA(vecA);
//***************************************************************************************************
//【注意】区分map与multimap:1、两者都会自动排序 2、multimap插入不会覆盖已有键值对(对于map若有相同key,则拒绝插入)
//<1>插入返回值 判定是否插入成功//带插入数据vector<int> pointTemp_ = { 1,2,3 }; // Insert方法不能覆盖,如果键已经存在,则插入失败【注意插入位置,是自动排序】int a1 = 4;//判定插入是否成功pair< map<vector<int>, int>::iterator, bool> isInsertOK;//注意这里声明isInsertOK = vecA.insert(pair<vector<int>, int>(pointTemp_, a1));cout << "插入成功? " << isInsertOK.second << endl;//打印printfA(vecA);//***************************************************************************************************
//<2>map对象的拷贝构造与赋值map<vector<int>, int> vecB(vecA); //拷贝构造map<vector<int>, int> vecC;vecC = vecA;vecC.swap(vecA);
//***************************************************************************************************
//<3>查找map<string, int> vecD;// 你以为按照下面初始化 vecD,他的size会是5? 由于insert方法不能覆盖,所以我们将map 改成 multimapvecD.insert(pair<string, int>((string)"china", 1));vecD.insert(pair<string, int>((string)"china", 2));//拒绝插入vecD.insert(pair<string, int>((string)"china", 3));//拒绝插入vecD.insert(pair<string, int>((string)"english", 1));vecD.insert(pair<string, int>((string)"english", 2));//拒绝插入multimap<string, int> vecE;vecE.insert(make_pair((string)"china", 1));vecE.insert(make_pair((string)"china", 1));//允许插入vecE.insert(make_pair((string)"china", 3));//允许插入vecE.insert(make_pair((string)"china", 4));//允许插入vecE.insert(make_pair((string)"china", 5));//允许插入vecE.insert(make_pair((string)"english", 1));vecE.insert(make_pair((string)"english", 2));//允许插入vecE.insert(make_pair((string)"america", 1));vecE.insert(make_pair((string)"america", 2));//允许插入vecE.insert(make_pair((string)"america", 3));//允许插入cout << "multimap 初始化" << endl;cout << "vecE所有元素"<<endl;printfB(vecE);//查找区间multimap<string, int> ::iterator it1 = vecE.lower_bound("china");   //指向vecD中第一个等于键值 “china”对应的元素multimap<string, int> ::iterator it2 = vecE.upper_bound("china");   //指向vecD中第一个大于键值 “china”对应的元素cout << it1->first << " " << it1->second << endl;cout << it2->first << " " << it2->second << endl;// 等于 = lower_bound + upper_boundpair<multimap<string, int>::iterator, multimap<string, int>::iterator > it3    = vecE.equal_range("china");map<string, int>::iterator it4 = it3.first;map<string, int>::iterator it5 = it3.second;//查找key = “china”键值对的个数int iCount = vecE.count("china");//查找key = “china”对应键值对multimap<string, int>::iterator it6 = vecE.find("china");//***************************************************************************************************
// <4>删除multimap<string, int>::iterator itBegin = vecE.begin();// 删除 vecE 前面三个元素 与 后面 三个元素// 在改善特征点匹配算法中有实践int index = 0;int vecA_size = vecE.size();//删除(自定义删除任何元素)for (multimap<string, int>::iterator it_ = vecE.begin(); it_ != vecE.end(); ){//<1>法1//vecE.erase(it_++);//<2>法2if ((0<=index)&&(index<=2)){it_ = vecE.erase(it_);//这样写,防止指针失效}else if (((vecA_size - 3) <= index) && (index <= (vecA_size - 1))){it_ = vecE.erase(it_);}else{it_++;}++index;}//删除multimap中key = "english"的 所有 元素vecE.erase("english");cout << "vecE删除key = english的 所有 元素 " << endl;printfB(vecE);//删除所有元素multimap<string, int>::iterator itBegin_ = vecE.begin();multimap<string, int>::iterator itEnd_ = vecE.end();vecE.erase(itBegin_, itEnd_);//bool isEmpty = vecE.empty();if (vecE.empty()){cout << "vecE已经被清空" << endl;}return 0;
}

三、其他成员类型

member typedefinitionnoteskey_typeThe first template parameter (Key)mapped_typeThe second template parameter (T)value_typepair<const key_type,mapped_type>key_compareThe third template parameter (Compare)defaults to: less<key_type>value_compareNested function class to compare elementssee value_compallocator_typeThe fourth template parameter (Alloc)defaults to: allocator<value_type>referencevalue_type&const_referenceconst value_type&pointerallocator_traits<allocator_type>::pointerfor the default allocator: value_type*const_pointerallocator_traits<allocator_type>::const_pointerfor the default allocator: const value_type*iteratora bidirectional iterator to value_typeconvertible to const_iteratorconst_iteratora bidirectional iterator to const value_typereverse_iteratorreverse_iterator<iterator>const_reverse_iteratorreverse_iterator<const_iterator>difference_typea signed integral type, identical to:
iterator_traits<iterator>::difference_typeusually the same as ptrdiff_tsize_typean unsigned integral type that can represent any non-negative value of difference_typeusually the same as size_t

参考:https://cplusplus.com/reference/map/map/

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"C++ STL - map 与 multimap用法和区别":http://eshow365.cn/6-36053-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!