当我叫了两次时,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
生成的范围不能与任一输入范围重叠。 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));
您在此处有未定义的行为。当您将迭代器作为输入和输出参数传递给result
时std::set_union
,写入输出迭代器会使所有输入迭代器失效。这是由于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::copy
是更合适的算法(或赋值result = set1;
)。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 错误:"Left of getValue must have class/struct/union"
- 得到错误"left of '.toString' must have class/struct/union",即使 toString 应该有一个合适的对象
- 获取"Use of undefined type"和"Must have class/struct/union"错误
- 不断收到错误"member reference base type 'string [1000]' is not a structure or union"不知道如何解决?
- 前向声明不够时如何避免"'identifier' uses undefined class/struct/union 'name'"错误?