首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ Primer 第 5 版關於 erase 返回值的說明是否錯誤?

     編輯:程式設計綜合問答

書中原文

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)細節可能不同,編譯器實現是最終權威。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved