map

Prerequisites:

map介紹

include

#include <map>

map的值是pair

map是以紅黑樹(AVL tree)排序,所以把map的值印出來會是以排序好的方式印出。

初始化

語法

map(initializer_list<pair<K,V>> il);
1
2
3
4
5
6
7
8
9
10
11
12
13
  // 建立空的map
  map<int, string> m1;
  // 使用initializer初始化值
  // map(initializer_list<pair<K,V>>)
  map<int,string> m2 = { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  // 省略等於號寫法
  // map<int,string> m2 { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  // 使用括號
  // map<int,string> m2({ {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} });
  for (auto& val:m2) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
6,Ken 7,Alice 8,Juli 9,Bill 10,Mary 

使用[]印出元素

1
2
  map<int,string> m2 = { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  cout << "m2[10] = " << m2[10] << endl;
m2[10] = Mary

若key不存在map中,則會新增空值

1
2
3
4
5
6
7
  map<int,string> m2 = { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  cout << "m2[10] = " << m2[10] << endl;
  cout << "m2[22] = " << m2[22] << endl;
  for (auto& val:m2) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
m2[10] = Mary
m2[22] = 
6,Ken 7,Alice 8,Juli 9,Bill 10,Mary 22, 

新增修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  map<int,string> m2 = { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  cout << "修改前" << endl;
  for (auto& val:m2) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
  // 新增
  m2[5] = "Eva";
  m2[4] = "Iric";
  // 修改
  m2[10] = "Yoyo";
  m2[9] = "Momo";
  cout << "修改後" << endl;
  for (auto& val:m2) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
修改前
6,Ken 7,Alice 8,Juli 9,Bill 10,Mary 
修改後
4,Iric 5,Eva 6,Ken 7,Alice 8,Juli 9,Momo 10,Yoyo 

插入insert

傳回值為void

語法

void insert(initializer_list<pair<K,V>> il);
1
2
3
4
5
6
7
8
9
10
11
12
  map<int,string> m2 = { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  cout << "修改前" << endl;
  for (auto& val:m2) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
  m2.insert({ {1, "Ben"}, {2, "Cindy"}, {3, "Rita"} });
  cout << "插入後" << endl;
  for (auto& val:m2) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
修改前
6,Ken 7,Alice 8,Juli 9,Bill 10,Mary 
插入後
1,Ben 2,Cindy 3,Rita 6,Ken 7,Alice 8,Juli 9,Bill 10,Mary 

若插入的key已存在map中,則不會插入,也不會提示錯誤

1
2
3
4
5
6
7
8
9
10
11
12
  map<int,string> m2 = { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  cout << "修改前" << endl;
  for (auto& val:m2) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
  m2.insert({ {10, "Ben"}, {9, "Cindy"}, {3, "Rita"} });
  cout << "插入後" << endl;
  for (auto& val:m2) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
修改前
6,Ken 7,Alice 8,Juli 9,Bill 10,Mary 
插入後
3,Rita 6,Ken 7,Alice 8,Juli 9,Bill 10,Mary 

傳回值為pair

語法

pair<iterator,bool> insert(initializer_list<pair<K,V>> il);

傳回值pair:first已插入的元素的iterator,second是插入的結果

1
2
3
4
5
6
7
8
  map<int,string> m2 = { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  auto ret = m2.insert({5, "Julia"});
  if (ret.second == true) {
  cout << "成功" << ", first = " << ret.first->first
  << ", second = " << ret.first -> second << endl;
  } else {
  cout << "失敗" << endl;
  }
成功, first = 5, second = Julia

使用emplace

pair<iterator,bool> emplace(initializer_list<pair<K,V>> il);

傳回值跟先前的一樣,不同的是使用emplace可以原地建構。

使用iterator建立map

1
2
3
4
5
6
7
8
9
10
11
12
  map<int,string> m2 = { {10, "Mary"}, {9, "Bill"}, {7, "Alice"}, {8, "Juli"}, {6, "Ken"} };
  m2.insert({ {1, "Ben"}, {2, "Cindy"}, {3, "Rita"} });
  // 使用iterator建立map
  auto first = m2.begin();
  first++;
  auto last = m2.end();
  last--;
  map<int, string> m3(first, last);
  for (auto & val:m3) {
  cout << val.first << "," << val.second << " ";
  }
  cout << endl;
2,Cindy 3,Rita 6,Ken 7,Alice 8,Juli 9,Bill 

results matching ""

    No results matching ""