You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动