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));