c++ STL map使用詳細總結

1.2.對組

首先我們需要了解什麼是對組,對組(pair)可將兩個值合成一個值,這兩個值可以具有不同的數據類型,可以分別用pair的兩個公有函數first和second訪問。

類模板:template<class T1,class T2>struct pair.

對組的創建有三種方法:

pair<string,int>pair1(string("name"),20);
pair<string,int>pair2 = make_pair("name",30);
pair<string,int>pair3 = pair1;

cout << pair1.first << endl;//訪問第一個元素
cout << pair1.second << endl;//訪問第二個元素

2.map 

map是STL的一個關聯容器,它提供一對一的hash,使用時需要#include<map>。第一個值可以稱爲關鍵字(key),每個關鍵字只能在map中出現一次;第二個值稱爲該關鍵字的值(value)。map以紅黑樹爲底層實現機制,會根據鍵值(key)自動排序。

map不允許相同鍵值存在,不能通過迭代器修改鍵值,只能修改實質值。

2.1.五種初始化方法

map<int,int>mymap;

mymap = {{1,1}};//這種方式可以在聲明時候初始化,不過這不是插入而是賦值,如果map裏之前有元素會被清除
mymap.insert(pair<int,int>(10,10));
mymap.insert(make_pair(20,20));
mymap.insert(map<int,int>::value_type(30,30));
mymap[40] = 40;

 insert方法可以插入多值:

//指定位置插入,效率更高
std::map<char, int>::iterator it = mymap.begin();
mymap.insert(it, std::pair<char, int>('b', 300));  

//範圍多值插入
std::map<char, int> anothermap;
anothermap.insert(mymap.begin(), mymap.find('c'));

// 列表形式插入
anothermap.insert({ { 'd', 100 }, {'e', 200} });

2.2.打印:

//方法一
for(map<int,int>::iterator it = mymap.begin();it!=mymap.end();it++)
{
    //*it就是一個pair
    cout << "key:" << (*it).first << "value:" << it->second << endl;
}

//方法二
for (auto it:mymap)
{
	//it就是一個pair
	cout << "key:" << it.first << "value:" << it.second << endl;
}

注意map的迭代器只有++,--功能,沒有+1,-1的功能(即不能it+=1),這點和vector等容器不一樣。 


2.3.判斷是否插入成功:

使用insert向map中插入pair後會有返回值,返回值類型爲pair<iterator,bool>,如果插入成功bool爲true,失敗則爲false。

map<int, int>mymap;

pair<map<int,int>::iterator,bool>ret = mymap.insert(pair<int, int>(10, 10));
if (ret.second)cout << "第一次插入成功" << endl;
else cout << "第一次插入失敗" << endl;

ret = mymap.insert(make_pair(10, 20));
if (ret.second)cout << "第二次插入成功" << endl;
else cout << "第二次插入失敗" << endl;

mymap.insert(map<int, int>::value_type(30, 30));

mymap[40] = 40;
mymap[40] = 50;

cout << mymap[60] << endl;

for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); it++)
{
	//*it就是一個pair
	cout << "key:" << (*it).first << "value:" << it->second << endl;
}

輸出結果:

前三種方法插入時如果key已經存在,將會插入失敗。如果使用mymap[40] = 40這種插入方法如果key存在,對應value將會被新插入的值覆蓋。如果通過mymap[60]這種方法訪問map中不存在的值,將會在map中插入訪問的key值,並給value默認初始化值。再比如:

map<int, int>mymap;
mymap[1]++;
mymap[2];
for (auto x : mymap)
	cout << x.first << " " << x.second << endl;

將會輸出:

2.4.取值: 

map可以通過[]和.at()的方式取值,[]效率更高,.at()會檢測是否越界,具體可以參考這裏。


3.map的操作:

     begin()         返回指向map頭部的迭代器
     clear()        刪除所有元素
     count()         返回指定元素出現的次數,查詢關鍵字爲key的元素的個數,在map裏結果非0即1
     empty()         如果map爲空則返回true
     end()           返回指向map末尾的迭代器
     equal_range()   返回特殊條目的迭代器對,即pair< lower_bound(),upper_bound() >
     erase()         刪除一個元素,括號裏可以是鍵值、可以是迭代器、也可以是兩個迭代器表示刪除多個元素
     find()          查找一個元素,關鍵字查詢,找到則返回指向該關鍵字的迭代器,否則返回指向end的迭代器
     insert()        插入元素,上面有詳細介紹
     key_comp()      返回比較元素key的函數
     lower_bound()   返回鍵值>=給定元素的第一個位置
     max_size()      返回可以容納的最大元素個數
     rbegin()        返回一個指向map尾部的逆向迭代器,不等於end()
     rend()          返回一個指向map頭部的逆向迭代器
     size()          返回map中元素的個數
     swap()           交換兩個map
     upper_bound()    返回鍵值>給定元素的第一個位置
     value_comp()     返回比較元素value的函數


4.map插入自定義類型key

前面知道了map在插入元素時會對裏面鍵值對按key的值排序,如果我們的key爲自定義數據類型,比如:

class MyKey
{
public:
	MyKey(int index, int id)
	{
		this->index1 = index;
		this->index1 = id;
	}
public:
	int index1;
	int index2;
};

此時需要新定義一個比較函數:

struct mycompare
{
	bool operator()(MyKey key1,MyKey key2)
	{
		return key1.index1 > key2.index1;
	}
};

在聲明map時加入這個比較函數:

map<MyKey, int, mycompare>mymap;

然後我們就可以向map插入元素了:

mymap.insert(make_pair(MyKey(3, 4), 20));

 

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