map 整理筆記

  • map 是關聯容器的一種, 其每個元素分爲 關鍵字該關鍵字的值 兩部分
  • map 容器中關鍵字唯一, 且按關鍵字排序

常見接口 接口作用
begin() 返回指向 map 頭部的迭代器
end() 返回指向 map 末尾的迭代器, 最後一個元素的下一個
count() 返回指定元素出現的 次數
size() 返回map中元素的 個數
max_size() 返回可以容納的 最大元素個數
insert() 插入元素
find() 查找一個元素, 返回一個迭代器
equal_range 返回兩個迭代器,第一個表示 <= 查找元素 的迭代器位置,第二個是 >它 的迭代器位置
empty() 如果 map 爲空則返回 true
erase() 刪除一個元素
clear() 刪除所有元素
swap() 交換兩個 map

#include <iostream>
#include <map>
using namespace std;

int main() {
    	map<int, string> myMap;

    	// 三種插入方式
    	// 1.  [] 直接插入
    	myMap[1] = "Aaaaaaa";
    	// 如果再有
    	myMap[1] = "Aaaa";
    	// 則會覆蓋掉前面的"Aaaa", 因爲 map 關鍵字的唯一性
    	// 當然, 如果關鍵字爲 1 的元素不存在, 就會新建並且插入 map

    	// 2. 利用 insert 函數
    	// (1)通過 pair<int, string>(2, ”Bbbb“) 構造 pair 元素
    	myMap.insert(pair<int, string>(2, "Bbbb"));
    	// (2)通過 make_pair 構造 pair 元素
    	myMap.insert(make_pair(3, "Cccc"));
    	// (3)通過 value_type 構造 pair 元素
    	myMap.insert(map<int, string>::value_type(4, "Dddd"));

    	// 用 insert 重複插入 則不成功
    	pair<map<int, string>::iterator, bool> ptr = myMap.insert(make_pair(1, "Aaaaaaa"));
    	if(ptr.second) {
        		cout << "插入成功" << endl;
    	} else {
        		cout << "插入不成功" << endl;
    	}

    	// 元素的刪除
    	// 刪除 值爲 "Dddd" 的元素
    	for(map<int, string>::iterator ptr = myMap.begin(); ptr != myMap.end(); ptr++) {
        		if(ptr->second.compare("Dddd") == 0) {
            			myMap.erase(ptr);
            			cout << "刪除成功" << endl;
        		}
    	}

    	myMap[5] = "Eeee";
    	// 統計 Eeee 出現的次數
    	cout << myMap.count(11) << endl;

    	// 查找 key = 4 的鍵值對
    	map<int, string>::iterator pt = myMap.find(4);
    	if(pt != myMap.end()) {
        		cout << "存在 key 值爲 4 的鍵值對" << endl;
    	} else {
        		cout << "不存在 key 值爲 4 的鍵值對" << endl;
    	}

    	// 查找 key = 4 的鍵值對的位置
    	// 返回兩個迭代器,第一個表示 <=4 的迭代器位置,第二個是 >4 的迭代器位置
    	pair<map<int, string>::iterator, map<int, string>::iterator> myPair = myMap.equal_range(4);
    	if(myPair.first == myMap.end()) {
        		cout << "小於等於 4 的位置不存在" << endl;
    	} else {
        		cout << myPair.first->first << " " << myPair.first->second << endl;
    	}

    	if(myPair.second == myMap.end()) {
        		cout << "大於 4 的位置不存在" << endl;
    	} else {
        		cout << myPair.second->first << " " << myPair.second->second << endl;
    	}

    	// 遍歷 map
    	for(auto ptr: myMap) {
        		cout << ptr.first << " " << ptr.second << endl;
    	}

    	// 清除 map
    	myMap.clear();

    	// map 是否爲空
    	cout << "map 是否爲空: " << myMap.empty() << endl;

    	return 0;
}

注意: map 和 multimap 十分類似,區別在於 map 容器中元素的關鍵字不能重複。而 multimap 可以, multimap 有的成員函數,map 都有。此外,map 還有成員函數 operator[ ]:T & operator[ ] (Key k);

該成員函數返回 first 值爲 k 的元素的 second 部分的引用。如果容器中沒有元素的 first 值等於 k,則自動添加一個 first 值爲 k 的元素。如果該元素的 second 成員變量是一個對象,則用無參構造函數對其初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章