C++中调用vector.push_back()的函数应选择何种返回类型?
解决vector.push_back()返回值导致的编译错误问题
咱们先把问题拆解清楚:你看到的编译错误,本质是类型不匹配。std::vector::push_back()这个方法的设计就是只做一件事——把元素添加到容器末尾,它的返回类型是void,完全不会返回任何值。但你的函数声明的返回类型是string,编译器当然会报错,毕竟它没法把void转换成string。
而且还有个容易被忽略的坑:你现在的symptom参数是按值传递的,也就是说函数里修改的只是原向量的一个副本,函数执行完之后,外面的原向量根本不会有任何变化!这个问题比返回类型的问题影响更大,得一起修正。
下面给你两种可行的修改方案:
方案1:改成无返回值的函数(推荐)
既然你的核心需求是往symptom里添加元素,不需要返回任何内容,直接把函数返回类型改成void就好,同时把参数改成引用传递,确保修改的是原向量:
#include <iostream> #include <vector> #include <string> using namespace std; void yesno(string holder, vector<string>& symptom) { if(holder == "Y" || holder == "y"){ symptom.push_back("Y"); } else if(holder == "N" || holder == "n"){ symptom.push_back("N"); } else{ cout << "Wrong input" << endl; symptom.push_back("-"); } }
这样调用函数后,原向量就会被正确修改,也不会有编译错误了。
方案2:返回修改后的向量(如果确实需要)
如果你有特殊需求,必须返回这个向量,那可以把函数返回类型改成vector<string>,然后在函数末尾返回symptom。同样要注意用引用传递参数,避免不必要的拷贝:
#include <iostream> #include <vector> #include <string> using namespace std; vector<string> yesno(string holder, vector<string>& symptom) { if(holder == "Y" || holder == "y"){ symptom.push_back("Y"); } else if(holder == "N" || holder == "n"){ symptom.push_back("N"); } else{ cout << "Wrong input" << endl; symptom.push_back("-"); } return symptom; }
不过这种方案其实没必要,因为通过引用已经能直接修改原向量了,返回它只是多做了一次拷贝(除非编译器优化),所以方案1是更高效合理的选择。
内容的提问来源于stack exchange,提问作者Franklin Fredric




