条件中的迭代器赋值 - 向量迭代器不兼容
Iterator assignment in a condition - vector iterators incompatible
我有一个 std::vector
的包装器,我已经实现了用另一个向量替换一个向量中的部分的函数。 我试图将迭代器的赋值直接放在 if
条件中,但得到了意想不到的结果。
我正在使用 Visual Studio 2013 并且定义了 FAIL
我得到 调试断言失败! - 向量迭代器不兼容。是否有可能从右到左评估条件?我无法克服它。
这是一个(实施不佳的)代码,它重现了我的问题 - 旨在用 vec_second
的第一个和第二个元素替换 vec
的第 3 个和第 4 个元素:
#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's GCC 上运行良好。
if((it = vec.erase(it, it + vec_second.size())) == vec.end())
由于它们之间没有序列点,编译器可以自由调用 erase
和 end
中的任一顺序。如果 end
首先被调用,该迭代器会立即被 erase
无效,导致未定义的行为。
您的 #ifndef FAIL
代码是执行此操作的安全方法。
我有一个 std::vector
的包装器,我已经实现了用另一个向量替换一个向量中的部分的函数。 我试图将迭代器的赋值直接放在 if
条件中,但得到了意想不到的结果。
我正在使用 Visual Studio 2013 并且定义了 FAIL
我得到 调试断言失败! - 向量迭代器不兼容。是否有可能从右到左评估条件?我无法克服它。
这是一个(实施不佳的)代码,它重现了我的问题 - 旨在用 vec_second
的第一个和第二个元素替换 vec
的第 3 个和第 4 个元素:
#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's GCC 上运行良好。
if((it = vec.erase(it, it + vec_second.size())) == vec.end())
由于它们之间没有序列点,编译器可以自由调用 erase
和 end
中的任一顺序。如果 end
首先被调用,该迭代器会立即被 erase
无效,导致未定义的行为。
您的 #ifndef FAIL
代码是执行此操作的安全方法。