set_union 我调用了两次得到了错误的结果
set_union got wrong result when i called it twice
这个问题让我困惑了好几个小时,
请帮我!
第一次调用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));
我调试上面的代码,得到这样的结果:
[0] 1 int
[1] 2 int
[2] 3 int
[3] 4 int
[4] 5 int
[5] 6 int
[6] 1 int
[7] - 572662307 int
[8] - 572662307 int
[9] - 572662307 int
[10] - 572662307 int
[11] - 572662307 int
[12] 4 int
[13] 5 int
[14] 6 int
[15] 7 int
[16] 8 int
The resulting range cannot overlap with either of the input ranges.
https://en.cppreference.com/w/cpp/algorithm/set_union
你为什么不用这个?
std::set_union(std::begin(set1), std::end(set1),
std::begin(set2), std::end(set2),
std::back_inserter(result));
你在这里有未定义的行为。当您将迭代器作为 std::set_union
的输入和输出参数传递给 result
时,写入输出迭代器会使所有输入迭代器无效。这是由于 std::vector
的内存布局 - 如果容量不能容纳新元素,写入它可能需要将其所有数据移动到新的内存位置,因此 references/pointers/iterators 引用无法再使用初始内存位置。
您想将结果存储在一个新的容器中,例如
std::vector<int> out;
std::set_union(std::begin(set2), std::end(set2),
std::begin(result), std::end(result),
std::back_inserter(out));
另请注意,对于第一次调用,std::copy
是更合适的算法(或赋值 result = set1;
)。
这个问题让我困惑了好几个小时, 请帮我! 第一次调用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));
我调试上面的代码,得到这样的结果:
[0] 1 int
[1] 2 int
[2] 3 int
[3] 4 int
[4] 5 int
[5] 6 int
[6] 1 int
[7] - 572662307 int
[8] - 572662307 int
[9] - 572662307 int
[10] - 572662307 int
[11] - 572662307 int
[12] 4 int
[13] 5 int
[14] 6 int
[15] 7 int
[16] 8 int
The resulting range cannot overlap with either of the input ranges. https://en.cppreference.com/w/cpp/algorithm/set_union
你为什么不用这个?
std::set_union(std::begin(set1), std::end(set1),
std::begin(set2), std::end(set2),
std::back_inserter(result));
你在这里有未定义的行为。当您将迭代器作为 std::set_union
的输入和输出参数传递给 result
时,写入输出迭代器会使所有输入迭代器无效。这是由于 std::vector
的内存布局 - 如果容量不能容纳新元素,写入它可能需要将其所有数据移动到新的内存位置,因此 references/pointers/iterators 引用无法再使用初始内存位置。
您想将结果存储在一个新的容器中,例如
std::vector<int> out;
std::set_union(std::begin(set2), std::end(set2),
std::begin(result), std::end(result),
std::back_inserter(out));
另请注意,对于第一次调用,std::copy
是更合适的算法(或赋值 result = set1;
)。