C++ map 刪除元素的 3 種方式

本篇將介紹如何使用 C++ map 刪除元素的 3 種方式,刪除 map 的元素有 3 種方式,
分別是

  • map 刪除指定的元素
  • map 刪除迭代器 iterator 指向的元素
  • map 刪除範圍內的元素

那就開始來介紹吧!

map 刪除指定的元素

C++ map 根據傳入的 key 值去刪除該元素,

std-map-erase.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// g++ std-map-erase.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <map>

int main() {
std::map<int, std::string> studentMap;
studentMap[1] = "Tom";
studentMap[3] = "John";
studentMap[5] = "Tiffany";

studentMap.erase(1);

for (const auto& m : studentMap) {
std::cout << m.first << " " << m.second << "\n";
}

return 0;
}

結果如下,

1
2
3 John
5 Tiffany

那如果 map 刪除不存在的元素會發生什麼事呢?

std-map-erase2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// g++ std-map-erase2.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <map>

int main() {
std::map<int, std::string> studentMap;
studentMap[1] = "Tom";
studentMap[3] = "John";
studentMap[5] = "Tiffany";

auto ret = studentMap.erase(1);
std::cout << ret << "\n";
for (const auto& m : studentMap) {
std::cout << m.first << " " << m.second << "\n";
}

ret = studentMap.erase(2);
std::cout << ret << "\n";
for (const auto& m : studentMap) {
std::cout << m.first << " " << m.second << "\n";
}

return 0;
}

map 刪除不存在的元素並不會造成什麼 crash 這種嚴重問題,他反而會回傳一個數量告訴你它刪除了多少個元素,以這個例子來說 erase(1) 是刪除了 1 個元素,erase(2) 是刪除了 0 個元素,結果如下,

1
2
3
4
5
6
1
3 John
5 Tiffany
0
3 John
5 Tiffany

erase() 回傳的是 size_type,實際上是什麼變數型態,可以利用這篇的技巧來印出變數型態。

map 刪除迭代器 iterator 指向的元素

C++ map 根據帶入的 iterator 迭代器去刪除該元素,

std-map-erase3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// g++ std-map-erase3.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <map>

int main() {
std::map<int, std::string> studentMap;
studentMap[1] = "Tom";
studentMap[3] = "John";
studentMap[5] = "Tiffany";

std::map<int, std::string>::iterator it;
it = studentMap.find(3);
studentMap.erase(it);

for (const auto& m : studentMap) {
std::cout << m.first << " " << m.second << "\n";
}

return 0;
}

輸出結果如下,

1
2
1 Tom
5 Tiffany

來看看另外一種 map 的例子,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// g++ std-map-erase4.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <map>

int main() {
std::map<std::string, int> studentMap;
studentMap["Tom"] = 1;
studentMap["John"] = 3;
studentMap["Tiffany"] = 5;

std::map<std::string, int>::iterator it;
it = studentMap.find("John");
studentMap.erase(it);

for (const auto& m : studentMap) {
std::cout << m.first << " " << m.second << "\n";
}

return 0;
}

輸出結果如下,

1
2
Tiffany 5
Tom 1

map 刪除範圍內的元素

C++ map 根據帶入兩個 iterator 迭代器的範圍去刪除,這邊先用 find 來找好要刪除範圍的第一個 iter 與最後一個 iter,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// g++ std-map-erase5.cpp -o a.out -std=c++11
#include <iostream>
#include <string>
#include <map>

int main() {
std::map<int, std::string> studentMap;
studentMap[1] = "Tom";
studentMap[2] = "Jack";
studentMap[3] = "John";
studentMap[4] = "Ann";
studentMap[5] = "Tiffany";

std::map<int, std::string>::iterator first = studentMap.find(2);
std::map<int, std::string>::iterator last = studentMap.find(4);
studentMap.erase(first, last);
for (const auto& m : studentMap) {
std::cout << m.first << " " << m.second << "\n";
}

std::cout << "---\n";

studentMap.erase(studentMap.begin(), studentMap.end());
for (const auto& m : studentMap) {
std::cout << m.first << " " << m.second << "\n";
}

return 0;
}

結果如下,

1
2
3
4
1 Tom
4 Ann
5 Tiffany
---

如果要刪除所有的元素的話可以用 clear(),或者指定頭 begin() 到尾 end() 也可以,用法如下,

1
studentMap.erase(studentMap.begin(), studentMap.end());

其它參考
map::erase - C++ Reference
http://www.cplusplus.com/reference/map/map/erase/

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
std::map 用法與範例
std::unordered_map 用法與範例
std::vector 用法與範例
std::deque 介紹與用法
std::queue 用法與範例
std::thread 用法與範例
std::mutex 用法與範例
std::find 用法與範例
std::sort 用法與範例
std::random_shuffle 產生不重複的隨機亂數
std::shared_ptr 用法與範例
std::async 用法與範例