You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并两个vector后排序时出现非法内存位置报错是什么原因?

段错误触发逻辑
  • 直接诱因:你声明的v3是初始长度为0的空vector,未分配任何存储元素的内存空间。调用set_union时直接传入v3.begin()作为输出迭代器,函数会直接向v3起始位置之后的内存写入合并后的元素,这些内存不属于v3的合法持有范围,属于野内存访问,直接触发段错误。
  • 额外问题:set_union是标准库提供的有序集合操作函数,要求两个输入序列必须预先完成升序排序,你给出的v1{2,3,1}、v2{5,4,6}均为无序状态,即使内存问题修复,也会得到不符合预期的结果,甚至触发其他未定义行为。
修复方案

你可以通过以下方式修正代码:

  1. 预先对两个待合并的vector进行排序,满足set_union的入参要求
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:45:03