我一直在学习 C++ 并遇到一个函数,但返回类型是一个向量。
这是代码:
vector<Name> inputNames() {
ifstream fin("names.txt");
string word;
vector<Name> namelist;
while (!fin.eof()) {
Name name;
fin >> name.first_name;
fin >> name.last_name;
namelist.push_back(name);
}
return namelist;
}
Run Code Online (Sandbox Code Playgroud)
name 是结构体的一部分,定义为:
struct Name {
string first_name;
string last_name;
bool operator<(const Name& d) const {
return last_name > d.last_name;
}
void display() {
cout << first_name << " " << last_name << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
使用vector< Name>inputName()的目的是什么?它在做什么?
为什么我不能创建一个空函数并通过它传递一个向量?
IE:
void input(vector<Name>&v){
ifstream fin("names.txt");
string word;
while (!fin.eof()) {
Name name;
fin >> name.first_name;
fin >> name.last_name;
v.push_back(name);
}
}
Run Code Online (Sandbox Code Playgroud)
JVA*_*pen 24
您的问题基本上是:我是按值返回还是使用输出参数?
社区的普遍共识是按值返回,尤其是从 C++17 开始,保证复制省略。虽然,我也推荐它 C++11 以上。如果您使用旧版本,请升级。
我们认为第一个片段更具可读性和可理解性,甚至性能更高。
从调用者的角度:
std::vector<Name> names = inputNames();
Run Code Online (Sandbox Code Playgroud)
很明显 inputNames 会在不更改程序现有状态的情况下返回一些值,假设您不使用全局变量(实际上是使用cin)。
第二个代码将按以下方式调用:
std::vector<Name> names;
// Other code
inputNames(names);
Run Code Online (Sandbox Code Playgroud)
这引发了很多问题:
当计算机运行缓慢并且编译器在优化时遇到问题时,它曾经是一种很好的做法,但是,此时不要将它用于输出参数。
你什么时候使用最后一种风格:如果你想要一个进出参数。在这种情况下,如果你打算追加,向量已经有数据,这实际上是有道理的。
Dev*_*lar 11
这基本上反映了函数的数学定义为......
...将输入与单个输出相关联的关系。
虽然您可以编写void修改其参数的函数,但这有缺点:
还有是语言,没有返回值工作,用“out参数”来代替。您也可以在 C++ 中以这种方式执行此操作。但总而言之,使用返回值作为函数的一个输出有助于程序的结构。