elem1 = slist.erase(elem1, elem2); // 調用後,elem1 == elem2
迭代器elem1指向要刪除的第一個元素,elem2指向要刪除的最後一個元素**之後**的位置。
C++ 標準(C++11 及以後)規定:
iterator erase(const_iterator first, const_iterator last);
返回值:**指向最後一個被刪除元素之後的迭代器**,即 last。
#include
#include
int main() {
std::list lst = {1,2,3,4,5};
auto it1 = lst.begin(); // 指向 1
auto it2 = std::next(it1, 3); // 指向 4 (刪除 1,2,3)
auto ret = lst.erase(it1, it2); // 刪除 [it1, it2)
std::cout << (ret == it2) << std::endl; // 輸出 1 (true)
std::cout << *ret << std::endl; // 輸出 4
}
運行結果證明:erase(first, last) 返回 last,書中說法 **完全正確**。
last 指向的元素 → **錯誤**,標準是左閉右開 [first, last)。last。遇到標準庫行為疑問,**優先編寫測試代碼驗證**,而非單憑記憶或二手資料。不同標準版本(C++98/11/14/17)細節可能不同,編譯器實現是最終權威。