9

我需要从 a 中删除一个元素,std::list然后用std::find. std::list::eraseend()列表调用的行为是什么?我的情况是这样的:

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说:

如果位置(或范围)有效,则函数从不抛出异常(不抛出保证)。否则,它会导致未定义的行为。

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

4

3 回答 3

19

该站点使用模糊(并且可以说是不正确的)术语“有效”,但库规范(C++11 23.2.3)使用更具体的术语“可取消引用”——这意味着迭代器必须引用一个对象。过去的迭代器是不可取消引用的,因此擦除它会产生未定义的行为。

于 2013-02-27T16:09:14.117 回答
6

它不是。尝试擦除end()会导致未定义的行为。

于 2013-02-27T16:05:46.970 回答
2

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() 未能在您的列表中找到一个值,它将返回结束迭代器,它基本上告诉您您正在搜索的值在您的列表之外(不在您的列表中)

于 2013-02-27T16:08:19.667 回答