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

C++调用insSort函数后原vector数组未排序的问题咨询

问题排查:C++函数调用后原vector未被修改

你的代码出现问题的核心在于函数参数的传递方式:

你定义的insSort函数参数是vector<int> arr,这是值传递——调用函数时会生成原vector的一个副本,函数内部对arr的排序操作只作用于这个副本,完全不会影响main函数里的原vector。所以main函数第三次输出的还是未排序的原始数据。

解决方案

方案1:使用引用传递(推荐)

将函数参数改为vector<int>& arr,这样函数直接操作原vector的内存空间,修改会直接反映到main函数的原对象上。

修改后的完整代码:

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

// 参数改为引用类型,避免拷贝,直接操作原vector
void insSort(vector<int>& arr)
{
    vector<int>::iterator i;
    for (i = arr.begin(); i != arr.end(); i++)
    {
        // first:输出排序前内容
        cout << *i << endl;
    }
    sort(arr.begin(), arr.end());
    cout << "调用排序函数成功" << endl;
    for (i = arr.begin(); i != arr.end(); i++)
    {
        // second:输出排序后内容
        cout << *i << endl;
    }
}
int main()
{
    int n;
    cin >> n;
    cout << "n=" << n << endl;
    vector<int> arr(n);
    
    for(int i=0;i<n;i++)
        cin >> arr[i];

    insSort(arr);
    vector<int>::iterator i;

    cout << "main函数中输出原vector:" << endl;
    for (i=arr.begin(); i != arr.end(); i++)
    {
        // third:输出main中的vector内容
        cout << *i << " ";
    }
    cout << endl;

    return 0;
}

方案2:返回排序后的vector

如果不想修改原vector,希望保留原始数据,可以让函数返回排序后的副本,在main函数中用返回值覆盖原vector。

完整代码示例:

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

// 返回排序后的vector副本
vector<int> insSort(vector<int> arr)
{
    vector<int>::iterator i;
    for (i = arr.begin(); i != arr.end(); i++)
    {
        // first:输出排序前内容
        cout << *i << endl;
    }
    sort(arr.begin(), arr.end());
    cout << "调用排序函数成功" << endl;
    for (i = arr.begin(); i != arr.end(); i++)
    {
        // second:输出排序后内容
        cout << *i << endl;
    }
    return arr;
}
int main()
{
    int n;
    cin >> n;
    cout << "n=" << n << endl;
    vector<int> arr(n);
    
    for(int i=0;i<n;i++)
        cin >> arr[i];

    // 用函数返回的排序后vector覆盖原vector
    arr = insSort(arr);
    vector<int>::iterator i;

    cout << "main函数中输出原vector:" << endl;
    for (i=arr.begin(); i != arr.end(); i++)
    {
        // third:输出main中的vector内容
        cout << *i << " ";
    }
    cout << endl;

    return 0;
}

方案对比

  • 引用传递效率更高,因为不需要拷贝整个vector,适合大多数需要修改原数据的场景。
  • 返回值方式会产生vector拷贝,适合需要保留原始数据、仅需获取排序后结果的场景。

内容的提问来源于stack exchange,提问作者pipi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:21:01