【C++】map::erase 與 vector::erase 的返回值

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<random>
#include<chrono>
using namespace std;
unsigned a[] = { 11,12,13,14,15,16,17,18,19,20 };
map<unsigned, unsigned> m; vector<unsigned> v;
mt19937_64 re;
int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); re.seed(chrono::steady_clock::now().time_since_epoch().count());
	for (auto i : a) {
		m.emplace(make_pair(i, i)); v.emplace_back(i);
	}
	shuffle(a, a + 10, re);
	for (auto i : a) {
		auto j = m.erase(m.find(i));
		cout << "(j == m.end) == " << boolalpha << (j == m.end()) << endl;
		cout << "m.crbegin()->first == " << m.crbegin()->first << endl;
		cout << "Erased term = " << i << ", m.size = " << m.size() << ", following term = " << j->first << endl;
		cout << endl;
	}
	cout << endl;
	for (auto i : a) {
		auto j = v.erase(find(v.cbegin(), v.cend(), i));
		cout << "(j == v.end) == " << boolalpha << (j == v.end()) << endl;
		cout << "*v.crbegin() = " << *v.crbegin() << endl;
		cout << "Erased term = " << i << ", v.size = " << v.size() << ", following term = " << *j << endl;
		cout << endl;
	}
	return 0;
}

輸出1:

(j == m.end) == false
m.crbegin()->first == 20
Erased term = 17, m.size = 9, following term = 18

(j == m.end) == true
m.crbegin()->first == 19
Erased term = 20, m.size = 8, following term = 0

(j == m.end) == true
m.crbegin()->first == 18
Erased term = 19, m.size = 7, following term = 0

(j == m.end) == false
m.crbegin()->first == 18
Erased term = 11, m.size = 6, following term = 12

(j == m.end) == false
m.crbegin()->first == 18
Erased term = 14, m.size = 5, following term = 15

(j == m.end) == false
m.crbegin()->first == 18
Erased term = 13, m.size = 4, following term = 15

(j == m.end) == false
m.crbegin()->first == 18
Erased term = 12, m.size = 3, following term = 15

(j == m.end) == false
m.crbegin()->first == 18
Erased term = 15, m.size = 2, following term = 16

(j == m.end) == true
m.crbegin()->first == 16
Erased term = 18, m.size = 1, following term = 0

(j == m.end) == true
m.crbegin()->first == 0
Erased term = 16, m.size = 0, following term = 0


(j == v.end) == false
*v.crbegin() = 20
Erased term = 17, v.size = 9, following term = 18

(j == v.end) == true
*v.crbegin() = 19
Erased term = 20, v.size = 8, following term = 20

(j == v.end) == true
*v.crbegin() = 18
Erased term = 19, v.size = 7, following term = 19

(j == v.end) == false
*v.crbegin() = 18
Erased term = 11, v.size = 6, following term = 12

(j == v.end) == false
*v.crbegin() = 18
Erased term = 14, v.size = 5, following term = 15

(j == v.end) == false
*v.crbegin() = 18
Erased term = 13, v.size = 4, following term = 15

(j == v.end) == false
*v.crbegin() = 18
Erased term = 12, v.size = 3, following term = 15

(j == v.end) == false
*v.crbegin() = 18
Erased term = 15, v.size = 2, following term = 16

(j == v.end) == true
*v.crbegin() = 16
Erased term = 18, v.size = 1, following term = 18

(j == v.end) == true
*v.crbegin() = 2348814080
Erased term = 16, v.size = 0, following term = 16

輸出2:

(j == m.end) == true
m.crbegin()->first == 19
Erased term = 20, m.size = 9, following term = 5701724

(j == m.end) == false
m.crbegin()->first == 19
Erased term = 12, m.size = 8, following term = 13

(j == m.end) == false
m.crbegin()->first == 19
Erased term = 17, m.size = 7, following term = 18

(j == m.end) == false
m.crbegin()->first == 19
Erased term = 18, m.size = 6, following term = 19

(j == m.end) == false
m.crbegin()->first == 19
Erased term = 15, m.size = 5, following term = 16

(j == m.end) == false
m.crbegin()->first == 19
Erased term = 14, m.size = 4, following term = 16

(j == m.end) == false
m.crbegin()->first == 19
Erased term = 11, m.size = 3, following term = 13

(j == m.end) == true
m.crbegin()->first == 16
Erased term = 19, m.size = 2, following term = 5701724

(j == m.end) == true
m.crbegin()->first == 13
Erased term = 16, m.size = 1, following term = 5701724

(j == m.end) == true
m.crbegin()->first == 5701724
Erased term = 13, m.size = 0, following term = 5701724


(j == v.end) == true
*v.crbegin() = 19
Erased term = 20, v.size = 9, following term = 20

(j == v.end) == false
*v.crbegin() = 19
Erased term = 12, v.size = 8, following term = 13

(j == v.end) == false
*v.crbegin() = 19
Erased term = 17, v.size = 7, following term = 18

(j == v.end) == false
*v.crbegin() = 19
Erased term = 18, v.size = 6, following term = 19

(j == v.end) == false
*v.crbegin() = 19
Erased term = 15, v.size = 5, following term = 16

(j == v.end) == false
*v.crbegin() = 19
Erased term = 14, v.size = 4, following term = 16

(j == v.end) == false
*v.crbegin() = 19
Erased term = 11, v.size = 3, following term = 13

(j == v.end) == true
*v.crbegin() = 16
Erased term = 19, v.size = 2, following term = 19

(j == v.end) == true
*v.crbegin() = 13
Erased term = 16, v.size = 1, following term = 16

(j == v.end) == true
*v.crbegin() = 2348817268
Erased term = 13, v.size = 0, following term = 13

可見,map 和 vector 的成員函數 erase 在成功擦除元素後,如果不是擦除了最後一項,就會返回下一項的(更新後的)迭代器。如果擦除了最後一項,則返回 end()。
對 end() 解引用是未定義行爲。

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