lex*_*xie 1 c++ iterator vector c++11
我正在玩弄着解迭代器失效规则.但是,当我在c ++ 14编译器中运行以下代码时,输出真的让我很困惑..
std::vector<int> test = {1,2,3};
auto it = test.begin() + 1;
test.erase(it);
std::cout << *it << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出= 3不应该在此时无效吗?为什么它似乎跳到下一个pos?提前谢谢了
取消引用无效的迭代器具有未定义的结果.您的程序可能会崩溃,它可能会因运行时错误或调试器中断而停止(如果您正在运行带有迭代器调试/验证的STL调试版本的调试版本)并且它可能"似乎工作",即交付从集合中删除的值.
这是因为迭代器可以实现为指针.这不一定是这种情况,但在这种情况下将行为定义为未定义允许这种有效且简单的实现.作为指针实现的无效迭代器仍然可以指向一个有效的内存位置,它可能仍然包含它先前包含的值,即使它在逻辑上不再是它所属的数据结构(集合)的一部分.没有验证代码可以在解除引用时检查迭代器是否有效(有时在调试版本中除外).
这既是C++的特性优势之一,也是其缺点之一,因为它可以在程序执行未定义的任务(由于错误或使用未经验证的用户输入)的情况下以稳定性和安全性为代价提供更好的性能.
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |