map關聯容器的基本操作
阿新 • • 發佈:2018-12-24
map<key,value>儲存的一對pair ,其內部通過紅黑樹實現,查詢效率非常高,使用者插入資料後,系統會自動根據key值大小進行排序,當然,一些自定義的類需要自定義比較函式,例如仿函式,過載< , >操作符等。
//簡單map容器初始化 void test02() { //map儲存的是一個pair map<int, string>MyMap; MyMap.insert(make_pair(1, "c++")); MyMap.insert(pair<int, string>(2, "python")); MyMap.insert(map<int, string>::value_type(3, "fortran")); //以上三種沒有區別,若再插入的pair中的key值與之前重複,則插入失敗,否則插入成功 MyMap[4] = "java";//[]裡放key值 ,該方法插入時若map中存在相同key值,則替換value值,否則直接插入 //迭代器進行遍歷 for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) { //it是指向pair的指標 it->first是key值 second是value值 cout << "key:" << it->first << " value:" << (*it).second << endl; } //----------------------------------------------------------------- //看看Mymap[] 和MyMap.insert的區別 MyMap.insert(make_pair(1, "c")); cout << "--------------------------------------------------------"<<endl; cout << "插入make_pair(1, \"c\")後的遍歷結果:" << endl; for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) { //it是指向pair的指標 it->first是key值 second是value值 cout << "key:" << it->first << " value:" << (*it).second << endl; } MyMap[1] = "c"; cout << "--------------------------------------------------------"<<endl; cout<< "MyMap[1] = \"c\"後的遍歷結果:" << endl; for (map<int, string>::iterator it = MyMap.begin(); it != MyMap.end(); it++) { //it是指向pair的指標 it->first是key值 second是value值 cout << "key:" << it->first << " value:" << (*it).second << endl; } }
//map的查詢 void test03() { map<int, string>Map1;//map<key,value> Map1.insert(make_pair(1, "anhui")); Map1.insert(make_pair(2, "beijing")); Map1.insert(make_pair(3, "shanghai")); int j = Map1.count(1);//find引數是key值 返回key值是1的個數 int i = Map1.count(4); for (map<int, string>::iterator it = Map1.begin(); it != Map1.end(); it++) { cout << "key:" << it->first << " value:" << it->second << endl; } cout << "key=1的資料有" << j << "個" << endl; cout << "key=4的資料有" << i << "個" << endl; map<int, string>::iterator ptr = Map1.find(2);//find返回迭代器 if (ptr == Map1.end()) cout << "找不到key=2的值" << endl; else cout << "key=2的值的value為" << ptr->second << endl; ptr = Map1.find(5); if (ptr == Map1.end()) cout << "找不到key=5的值" << endl; else cout << "key=5的值的value為" << ptr->second << endl; }
//map儲存自定義的類 class Person{ public: Person(int age, char gender, string name) :m_age(age), m_gender(gender), m_name(name) {}; friend bool operator <(const Person& p1, const Person& p2) { return p1.m_age < p2.m_age; } friend ostream& operator<< (ostream& os, const Person& p) { os << "age:" << p.m_age << " gender:" << p.m_gender << " name" << p.m_name ; return os; } private: int m_age; char m_gender; string m_name; }; void test04() { map<Person, string>m_map; Person p1(15, 'b', "jack"); Person p2(19, 'g', "mike"); Person p3(20, 'g', "lucy"); Person p4(28, 'b', "joshon"); m_map[p1] = "CHN"; m_map[p2] = "JAPAN"; m_map[p3] = "CANADA"; m_map.insert(make_pair(p4, "KOREAN")); for (map<Person, string>::iterator it = m_map.begin(); it != m_map.end(); it++) { cout << "PERSION " << it->first << " REGION " << it->second<<endl; } //執行m_map.insert()的返回值 返回一個pair, pair.first 是與當前map型別一致,pair.second是bool值 ,插入成功是true ,否則false pair < map<Person, string>::iterator, bool > ptr = m_map.insert(make_pair(p2, "CHN")); if (ptr.second == false) cout << "make_pair(p2, \"CHN\")插入失敗"; else cout << "make_pair(p2, \"CHN\")插入成功"; }