簡體   English   中英

擦除`std :: list`的`end()`的行為是什么?

[英]What is the behavior of erasing the `end()` of a `std::list`?

我需要在使用std::find找到它后從std::list刪除一個元素。 使用std::list::eraseend()調用std::list::erase的行為是什么? 我的情況是這樣的:

std::list<T> mylist;
T value;
std::list::iterator it = std::find(mylist.begin(), mylist.end(), value);
std::list::iterator next = mylist.erase(it);

cplusplus.com說:

如果position(或range) 有效 ,則函數永遠不會拋出異常(無拋出保證)。 否則,它會導致未定義的行為。

但我不知道的是end()在那里是否有效。

該站點使用模糊(並且可以說是不正確的)術語“有效”,但庫規范(C ++ 11 23.2.3)使用更具體的術語“可解除引用” - 意味着迭代器必須引用一個對象。 過去的迭代器不能解除引用,因此擦除它會產生未定義的行為。

事實並非如此。 嘗試擦除end()導致未定義的行為。

end()返回一個迭代器,引用列表容器中的past-the-end迭代器,而不是列表中的最后一個對象。

刪除/刪除結束時,您將刪除列表范圍之外的內容。 你的代碼應該是:

std::list<T> mylist;
T value;
std::list::iterator it = std::find(mylist.begin(), mylist.end(), value);
If(it!=mylist.end())
  std::list::iterator next = mylist.erase(it);

此外,如果find()無法在列表中找到值,它將返回結束迭代器,它基本上告訴您,您要搜索的值不在列表中(不在列表中)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM