如何将迭代器(包括结束和开始之前的迭代器)测试到列表或forward_list保持有效

How to test Iterators (including the off-the-end and the before-the-beginning iterators) to a list or forward_list remain valid,

本文关键字:迭代器 forward 列表 list 有效 测试 包括 结束和开始      更新时间:2023-10-16

通过C++入门工作,并对练习 9.25 感到困惑。

请考虑以下代码从列表中擦除所有元素:

list<int> lst = {0,1,2,3,4,5,6,7,8,9};
elem1 = lst.begin();
elem2 = lst.end();
elem1 = lst.erase(elem1, elem2);

练习 9.25 询问无效元素:如果 elem2 或 elem1 和 elem2 都是非端迭代器,会发生什么情况?

如何编写代码来测试这个具有离线迭代器的问题?

我试过这个:

std::list<int> lst = { 0,1,2,3,4,5,6,7,8,9 };
lst.erase(lst.begin(), ++lst.end());

根据第9.3.6节的文本:答案是

Iterators, pointers, and references (including the off-the-end and the 
before-the-beginning iterators) to a list or forward_list remain valid.

如何创建示例代码以查看解决方案是否正确?迭代器仍然有效?当我使用上面的代码时,抛出的错误是"列表迭代器不可增量">

没有内置机制来检查迭代器、指针或引用是否有效。在某些情况下,如果您知道迭代器或指针将失效,则可以将其设置为已知值,例如nullptr(对于指针)或迭代器end容器(对于迭代器)。通常,您必须简单地设计软件,使其永远不会在无效的迭代器上执行操作。一旦迭代器失效,就不能使用它,甚至不能将其与其他迭代器进行比较以查看它是否有效。

如果要检查有效的迭代器是否是过去结束迭代器,通常将其与容器的end迭代器进行比较(请参阅 std::end)。