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 }