在修改列表后,std :: list< t> :: end()的值是否会更改

Does the value of std::list<T>::end() change after modifying list?

本文关键字:是否 end gt 列表 std list 修改 lt      更新时间:2023-10-16

我正在尝试利用以下事实,即迭代列表后列表在插入和删除后保持有效(除了迭代器除外,您刚刚删除的内容)。std::list<T>::end();

这也是如此吗

假设我尝试以下内容:

typedef std::list<int> list_int;
list_int myList;
list_int::iterator iter = myList.end();
myList.push_back(1);
myList.push_back(2);
myList.push_back(3);
if(iter == myList.end()) {
    /* do things here */
} else {
    /* do different things here */
    /* I don't expect this branch to ever execute */
}

这很重要,因为在其他地方我可能会将一组迭代器存储到此列表中,并且我将通过与myList.end()进行比较来测试有效性。重要的是,即使在插入和拆卸后,无效的迭代器也如此。

std::list s结束迭代器的值在列表的寿命中永远不会更改。它总是有效的,总是相同的,并且总是对应于列表的虚构"过去"元素。这意味着some_list.end()在列表寿命中的任何时刻记忆的值始终与some_list.end()的寿命其他任何点相同。

语言规范未明确说明。但是,列表上根本没有任何有效的操作可以使结束迭代器无效或将其值与其他位置相关联。

在您的示例中,该if的第二个分支将永远不会执行。

如果我不丢失任何东西,那么std::mapstd::set也是如此。

您是否通过在if语句的每个子句中放置cout来尝试简单的测试?通过这样做,您将意识到 first 子句(iter == myList.end())确实是 true

我将简单地基于end()函数的文档:http://www.cplusplus.com/reference/reference/stl/list/end/。它说:"返回涉及列表容器中过去的元素的迭代器。"因此,如果返回了 em>末端的迭代器,那么难道不应该总是指向过去的末端?在此之前插入的元素点不应影响迭代器指向的位置(这是列表的最后一个元素之后的点)。