C++ 当我叫它两次时,它得到了错误的结果

C++ 当我叫它两次时,它得到了错误的结果,c++,algorithm,stl,set-union,C++,Algorithm,Stl,Set Union,这个问题困扰了我好几个小时, 请帮帮我! 第一次调用set_union时,结果是正确的,但第二次调用时,结果是错误的,请参见代码: std::vector<int> set1{ 1, 2, 3, 4, 5, 6 }; std::vector<int> set2{ 4, 5, 6, 7, 8 }; std::vector<int> result{}; std::set_union(std::begin(set1), std::end(set1), st

这个问题困扰了我好几个小时, 请帮帮我! 第一次调用set_union时,结果是正确的,但第二次调用时,结果是错误的,请参见代码:

std::vector<int> set1{ 1, 2, 3, 4, 5, 6 };
std::vector<int> set2{ 4, 5, 6, 7, 8 };
std::vector<int> result{};

std::set_union(std::begin(set1), std::end(set1),
    std::begin(result), std::end(result), 
    std::back_inserter(result));  
// result is 1 2 3 4 5 6

std::back_insert_iterator< std::vector<int>> back2 =
    std::set_union(std::begin(set2), std::end(set2), 
        std::begin(result), std::end(result), 
        std::back_inserter(result)); 
结果范围不能与任一输入范围重叠。

你为什么不用这个

 std::set_union(std::begin(set1), std::end(set1), 
    std::begin(set2), std::end(set2), 
    std::back_inserter(result)); 

您在这里有未定义的行为。当您将迭代器作为输入参数和输出参数传递给
result
时,写入输出迭代器将使所有输入迭代器无效。这是由于
std::vector
的内存布局造成的-写入它可能需要将其所有数据移动到新的内存位置,如果容量不能容纳新元素,则无法再使用引用初始内存位置的引用/指针/迭代器

您希望将结果存储在新容器中,例如

std::vector<int> out;
std::set_union(std::begin(set2), std::end(set2), 
    std::begin(result), std::end(result), 
    std::back_inserter(out));
std::向量输出;
std::set_union(std::begin(set2),std::end(set2),
标准::开始(结果),标准::结束(结果),
标准:背向插入器(输出);
还要注意,对于第一次调用,
std::copy
是更合适的算法(或赋值
result=set1;