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


     map 与 multimap是存储key-value(键-值 对)类型的容器。

     不同之处在于:map只允许key与 value一一对应;multimap一个key可对应多个value;

     

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

  1 #include<opencv2/opencv.hpp>
  2 #include<map>
  3 #include<iostream>
  4 #include <algorithm>    // std::sort
  5 
  6 
  7 using namespace std;
  8 
  9 //打印函数可写成模板
 10 
 11 //打印函数 printfA
 12 void printfA(map<vector<int>, int> vec_)
 13 {
 14     for (std::map<std::vector<int>, int>::iterator it = vec_.begin(); it != vec_.end(); it++)
 15     {
 16         std::cout << it->first[0] << "  " << it->first[1] << "  " << it->first[2] << "  " << it->second << std::endl;
 17     }
 18     cout << "容积 = " << vec_.size() << endl;
 19 }
 20 
 21 //打印函数 printfB
 22 void printfB(multimap<string, int> vec_)
 23 {
 24     for (multimap<string, int>::iterator it = vec_.begin(); it != vec_.end(); it++)
 25     {
 26         std::cout << it->first  << "  " << it->second << std::endl;
 27     }
 28     cout << "容积 = " << vec_.size() << endl;
 29 }
 30 
 31 int main()
 32 {
 33     //声明,定义
 34     std::map<int, std::string> m;
 35     m[3] = "h1";
 36     m[0] = "what";
 37     // 构建 key-value
 38     m.insert(std::pair<int, std::string>(2, "love you"));
 39 
 40     std::cout << m[0].c_str() << std::endl;//这里数字 不是索引值了
 41     std::cout << m[3].c_str() << std::endl;
 42     std::cout << m[4].c_str() << std::endl;
 43     std::cout << m[2].c_str() << std::endl;   // 会产生一个新的元素,即m[2] = ""
 44 
 45     m[6] = string("slam2345");
 46     std::cout << m.size() << std::endl;       // 5
 47     //遍历
 48     for (std::map<int, std::string>::iterator it = m.begin(); it != m.end(); it++)
 49         std::cout << it->first << ", " << it->second.c_str() << std::endl;
 50 
 51 
 52     std::vector<int> pointTemp;
 53     std::map<std::vector<int>, int> vecA;
 54     for (int y = 0; y < 4; y++)
 55     {
 56         for (int x = 0; x < 4; x++)
 57         {
 58             pointTemp.push_back(y);
 59             pointTemp.push_back(x);
 60             pointTemp.push_back(x + y);
 61             //插入
 62             vecA.insert(std::pair<std::vector<int>, int>(pointTemp, (y * 4 + x + 1)));
 63             pointTemp.clear();
 64         }
 65     }    
 66     printfA(vecA);
 67 //***************************************************************************************************
 68 //【注意】区分map与multimap:1、两者都会自动排序 2、multimap插入不会覆盖已有键值对(对于map若有相同key,则拒绝插入)
69 //<1>插入返回值 判定是否插入成功 70 //带插入数据 71 vector<int> pointTemp_ = { 1,2,3 }; // Insert方法不能覆盖,如果键已经存在,则插入失败【注意插入位置,是自动排序】 72 int a1 = 4; 73 //判定插入是否成功 74 pair< map<vector<int>, int>::iterator, bool> isInsertOK;//注意这里声明 75 isInsertOK = vecA.insert(pair<vector<int>, int>(pointTemp_, a1)); 76 cout << "插入成功? " << isInsertOK.second << endl; 77 //打印 78 printfA(vecA); 79 80 //*************************************************************************************************** 81 //<2>map对象的拷贝构造与赋值 82 map<vector<int>, int> vecB(vecA); //拷贝构造 83 map<vector<int>, int> vecC; 84 vecC = vecA; 85 vecC.swap(vecA);
86 //*************************************************************************************************** 87 //<3>查找 88 map<string, int> vecD; 89 // 你以为按照下面初始化 vecD,他的size会是5? 由于insert方法不能覆盖,所以我们将map 改成 multimap 90 vecD.insert(pair<string, int>((string)"china", 1)); 91 vecD.insert(pair<string, int>((string)"china", 2));//拒绝插入 92 vecD.insert(pair<string, int>((string)"china", 3));//拒绝插入 93 vecD.insert(pair<string, int>((string)"english", 1)); 94 vecD.insert(pair<string, int>((string)"english", 2));//拒绝插入 95 96 multimap<string, int> vecE; 97 vecE.insert(make_pair((string)"china", 1)); 98 vecE.insert(make_pair((string)"china", 1));//允许插入 99 vecE.insert(make_pair((string)"china", 3));//允许插入 100 vecE.insert(make_pair((string)"china", 4));//允许插入 101 vecE.insert(make_pair((string)"china", 5));//允许插入 102 vecE.insert(make_pair((string)"english", 1)); 103 vecE.insert(make_pair((string)"english", 2));//允许插入 104 vecE.insert(make_pair((string)"america", 1)); 105 vecE.insert(make_pair((string)"america", 2));//允许插入 106 vecE.insert(make_pair((string)"america", 3));//允许插入 107 cout << "multimap 初始化" << endl; 108 cout << "vecE所有元素"<<endl; 109 printfB(vecE); 110 //查找区间 111 multimap<string, int> ::iterator it1 = vecE.lower_bound("china"); //指向vecD中第一个等于键值 “china”对应的元素 112 multimap<string, int> ::iterator it2 = vecE.upper_bound("china"); //指向vecD中第一个大于键值 “china”对应的元素 113 cout << it1->first << " " << it1->second << endl; 114 cout << it2->first << " " << it2->second << endl; 115 // 等于 = lower_bound + upper_bound 116 pair<multimap<string, int>::iterator, multimap<string, int>::iterator > it3 = vecE.equal_range("china"); 117 map<string, int>::iterator it4 = it3.first; 118 map<string, int>::iterator it5 = it3.second; 119 120 //查找key = “china”键值对的个数 121 int iCount = vecE.count("china"); 122 123 //查找key = “china”对应键值对 124 multimap<string, int>::iterator it6 = vecE.find("china"); 125 126 //*************************************************************************************************** 127 // <4>删除 128 multimap<string, int>::iterator itBegin = vecE.begin(); 129 // 删除 vecE 前面三个元素 与 后面 三个元素 130 // 在改善特征点匹配算法中有实践 131 int index = 0; 132 int vecA_size = vecE.size(); 133 //删除(自定义删除任何元素) 134 for (multimap<string, int>::iterator it_ = vecE.begin(); it_ != vecE.end(); ) 135 { 136 //<1>法1 137 //vecE.erase(it_++); 138 //<2>法2 139 if ((0<=index)&&(index<=2)) 140 { 141 it_ = vecE.erase(it_);//这样写,防止指针失效 142 } 143 144 else if (((vecA_size - 3) <= index) && (index <= (vecA_size - 1))) 145 { 146 it_ = vecE.erase(it_); 147 } 148 else 149 { 150 it_++; 151 } 152 ++index; 153 } 154 155 156 //删除multimap中key = "english"的 所有 元素 157 vecE.erase("english"); 158 cout << "vecE删除key = english的 所有 元素 " << endl; 159 printfB(vecE); 160 161 //删除所有元素 162 multimap<string, int>::iterator itBegin_ = vecE.begin(); 163 multimap<string, int>::iterator itEnd_ = vecE.end(); 164 vecE.erase(itBegin_, itEnd_); 165 //bool isEmpty = vecE.empty(); 166 167 if (vecE.empty()) 168 { 169 cout << "vecE已经被清空" << endl; 170 } 171 return 0; 172 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM