我需要使用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);
如果位置(或范围)有效,则该函数永远不会抛出异常(无抛出保证)。 否则,它会导致未定义的行为。
但我不知道end()
在那里是否有效。
答案 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()无法在列表中找到值,它将返回结束迭代器,它基本上告诉您,您要搜索的值不在列表中(不在列表中)