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

时间:2013-02-27 16:03:58

标签: c++ stl iterator

我需要使用std::list找到std::find中的元素。使用列表的std::list::erase调用end()的行为是什么?我的情况是这样的:

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()在那里是否有效。

3 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:6)

不是。试图删除end()会导致未定义的行为。

答案 2 :(得分:2)

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()无法在列表中找到值,它将返回结束迭代器,它基本上告诉您,您要搜索的值不在列表中(不在列表中)