如何将迭代器(包括结束和开始之前的迭代器)测试到列表或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,
通过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)。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?