为什么我们在 C++ 中使用返回数据结构的函数?

wil*_*am_ 11 c++ function

我一直在学习 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)

这引发了很多问题:

  • inputNames 使用名称作为输入还是扩展它?
  • 如果名称中有值,函数用它做什么?
  • 函数是否有返回值表示成功?

当计算机运行缓慢并且编译器在优化时遇到问题时,它曾经是一种很好的做法,但是,此时不要将它用于输出参数。

你什么时候使用最后一种风格:如果你想要一个进出参数。在这种情况下,如果你打算追加,向量已经有数据,这实际上是有道理的。


Dev*_*lar 11

这基本上反映了函数的数学定义为......

...将输入与单个输出相关联的关系。

虽然您可以编写void修改其参数的函数,但这有缺点:

  • 意图的表达。考虑一个带有多个参数的函数。哪些是输入,哪些是输出?
  • 目的明确。一次修改多个值的函数通常(并不总是)试图一次做太多的事情。专注于每个函数的一个返回值有助于控制程序逻辑。
  • 铁路。您不能使用 void 函数来初始化变量,这意味着您必须首先声明该变量(初始化为某个“默认”值),然后将其初始化为所需的值。

还有语言,没有返回值工作,用“out参数”来代替。您也可以在 C++ 中以这种方式执行此操作。但总而言之,使用返回值作为函数的一个输出有助于程序的结构。