繁体   English   中英

条件中的迭代器赋值 - 矢量迭代器不兼容

[英]Iterator assignment in a condition - vector iterators incompatible

我有一个std::vector的包装器,我已经实现了用另一个向量替换向量中的一个部分的函数。 我试图将迭代器的赋值直接放在if条件中,并得到意想不到的结果

我正在使用Visual Studio 2013并且使用FAIL定义我得到Debug Assertion失败! - 矢量迭代器不兼容 是否有可能从右到左评估病情? 我无法克服它。

这是一个(执行不佳)代码,它可以重现我的问题 - 用vec_second第一和第二个元素替换vec第三和第四个元素:

#include <iostream>
#include <vector>
#include <iterator>
using std::cout;

//#define FAIL

int main()
{
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> vec_second = {6, 7};

    auto it = vec.begin() + 2;

#ifndef FAIL
    it = vec.erase(it, it + vec_second.size());

    if(it == vec.end())
#else
    if((it = vec.erase(it, it + vec_second.size())) == vec.end())
#endif
        vec.reserve(vec.size() + vec_second.size());

    vec.insert(it, vec_second.begin(), vec_second.end());

    for(auto const& x : vec)
        cout << x << " ";
}

但在Coliru的GCC上运行良好。

if((it = vec.erase(it, it + vec_second.size())) == vec.end())

由于它们之间没有序列点,因此编译器可以自由调用erase并以任何顺序end 如果首先调用end ,那么迭代器会立即因erase失效,从而导致未定义的行为。

你的#ifndef FAIL代码是安全的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM