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 }