合并两个vector后排序时出现非法内存位置报错是什么原因?
段错误触发逻辑
- 直接诱因:你声明的
v3是初始长度为0的空vector,未分配任何存储元素的内存空间。调用set_union时直接传入v3.begin()作为输出迭代器,函数会直接向v3起始位置之后的内存写入合并后的元素,这些内存不属于v3的合法持有范围,属于野内存访问,直接触发段错误。 - 额外问题:
set_union是标准库提供的有序集合操作函数,要求两个输入序列必须预先完成升序排序,你给出的v1{2,3,1}、v2{5,4,6}均为无序状态,即使内存问题修复,也会得到不符合预期的结果,甚至触发其他未定义行为。
修复方案
你可以通过以下方式修正代码:
- 预先对两个待合并的vector进行排序,满足
set_union的入参要求 - 使用
back_inserter作为输出迭代器,自动调用push_back为v3动态扩容,无需手动计算分配空间大小
修正后的完整代码如下:
#include <iostream> #include <vector> #include <algorithm> #include <iterator> using namespace std; void vec_output(vector <int> vec_input) { for (int i = 0; i < vec_input.size(); i++) { cout << vec_input[i] << ' '; } cout << endl; } int main(){ vector <int> v1{2,3,1}; vector <int> v2{5,4,6}; sort(v1.begin(), v1.end()); sort(v2.begin(), v2.end()); vector <int> v3; set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v3)); vec_output(v3); return 0; }
另外补充说明:set_union输出的结果本身就是升序有序的,后续不需要再额外调用sort排序。
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

