C++函数操作vector传值导致添加元素失效问题咨询
问题诊断
你的判断完全正确,addNumber执行后数据不保存的核心原因就是 值传递参数会在函数作用域内生成传入vector的独立副本,函数内push_back操作只修改这个临时副本,函数运行结束后副本就会被销毁,main函数里的原始data容器不会有任何改动。
除此之外你的代码还有几个签名不匹配的隐患:
- 顶部的函数声明参数写为
vector<int> [],这是vector数组类型,和你实际要传入的单个vector对象类型不符 addNumber的声明标注了2个入参,实际定义只有1个入参,前后签名不一致- 只读操作(打印、计算均值、找最值)的函数使用值传递会产生不必要的vector拷贝,有额外性能开销
修复方案
- 需要修改原vector的函数(比如
addNumber),将参数改为左值引用类型,即参数写为vector<int>& 形参名,这样函数内操作的就是原始对象本身,不会生成副本 - 仅读取vector内容、不做修改的函数(打印、求均值、找最大最小值),将参数改为const左值引用,即
const vector<int>& 形参名,既避免拷贝开销,又能防止意外修改原数据 - 统一修正所有函数的前置声明和实际定义的签名,保证两者完全一致
核心修正后的代码示例:
#include <iostream> #include <vector> using namespace std; // 修正后的函数前置声明,签名和实现保持一致 void calculateMean(const vector<int>&); void addNumber(vector<int>&); void smallestNumber(const vector<int>&); void largestNumber(const vector<int>&); void printNumbers(const vector<int>&); void printNumbers(const vector<int>& list ) { if (list.empty()) { cout << "[] - the list is empty."; } else { for (auto val : list) { cout << val << " "; } } cout << endl << "------------" << endl; } void addNumber(vector<int>& list ) { int num {}; cout << "Please enter an integer:"; cin >> num; list.push_back(num); } // 其余calculateMean、smallestNumber、largestNumber函数实现时,按照上述参数规则编写即可 int main() { vector<int> data {}; char selection {}; do { cout << "P. print numbers" << endl; cout << "A. Add a number" << endl; cout << "M. display mean of numbers" << endl; cout << "S. display smallest number" << endl; cout << "L. display largest number" << endl; cout << "Q. quit program." << endl; cin >> selection; if (selection == 'P') { printNumbers(data); } else if (selection == 'A') { addNumber(data); } // 补全M、S、L分支的函数调用即可 } while (selection != 'Q'); return 0; }
修改后再测试,添加的数字就会正常存入main函数的data容器中,打印功能也能正常输出已添加的内容。
内容的提问来源于stack exchange,提问作者PardonMySkillz
相关产品推荐
相关产品推荐

