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
相关产品推荐
相关产品推荐

