为什么合并后对向量进行排序时显示非法内存位置?

4da*_*ong 0 c++ stl

我尝试在合并两个向量后对新向量进行排序,代码如下,

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>

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};
    vector <int> v3;
    set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
    sort(v3.begin(), v3.end());
    vec_output(v3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,它显示错误:Exception has occurred. Segmentation fault,我知道这可能是由于访问未知内存引起的,但是怎么办?

use*_*570 5

问题是它是空的,因此不可能将其写最后一个参数。您应该使用:v3v.begin()set_unionback_inserter

set_union(v1.begin(), v1.end(), v2.begin(), v2.end(),  std::back_inserter(v3));
Run Code Online (Sandbox Code Playgroud)

std::back_inserter返回一个输出迭代器 back_insert_iterator,该迭代器将用于v3.push_back将元素追加/推回到v3.

另外,来自std::set_union 文档

使用运算符< 比较元素,并且范围必须相对于相同元素进行排序。

(强调我的)

另请注意,使用后set_union无需使用std::sorton v3