为什么我们要使用在C+;中返回数据结构的函数+;? 我一直在学习C++,遇到了函数,但是返回类型是向量。< /P>

为什么我们要使用在C+;中返回数据结构的函数+;? 我一直在学习C++,遇到了函数,但是返回类型是向量。< /P>,c++,function,C++,Function,代码如下: 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;

代码如下:

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;
}
使用向量输入名()的目的是什么?它在干什么

为什么我不能创建一个空函数并通过它传递一个向量呢

即:

无效输入(矢量和v){
ifstream fin(“names.txt”);
字符串字;
而(!fin.eof()){
姓名;
fin>>name.first\u name;
fin>>name.last_name;
v、 推回(姓名);
}
}
向量是方法的返回值。它将创建一个具有结构向量的新对象

您的实现称为“引用调用”。它将把指针传递给现有的向量。例如,通过引用实现的调用,您可以多次调用
input(vector&v)
,并且您先前存在的向量将包含多次内容。如果你想使用向量返回值来创建一个新的对象,那么它总是会创建一个只包含一次迭代数据的新对象。

这基本上反映为

…将输入关联到单个输出的关系

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

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

有些语言不使用返回值,而是使用“out参数”。在C++中你也可以这样做。但总而言之,使用返回值作为函数的一个输出有助于程序的结构。

您的问题基本上是:我是按值返回还是使用输出参数

社区中的普遍共识是按值返回,特别是从C++17开始,保证拷贝省略。尽管如此,我还是推荐C++11以后的版本。如果您使用的是旧版本,请升级

我们认为第一个片段更可读,更易于理解,更具性能。

从呼叫者的角度来看:

std::vector<Name> names = inputNames();
这引发了很多问题:

  • inputNames是使用名称作为输入还是扩展名称
  • 如果名称中有值,函数将如何处理它
  • 函数是否有返回值来表示成功
当计算机运行缓慢,编译器在优化时遇到问题时,这是一种很好的做法,不过,在这一点上,不要将它用于输出参数


什么时候使用最后一种样式:如果需要输入输出参数。在这种情况下,如果你想添加,向量已经有了数据,这实际上是有意义的。

我在阅读此任务之前感到紧张,阅读后,脸上挂着微笑。。。好的,这将取决于用例,例如:如果程序员不想改变函数中传递的参数,并且更喜欢从方法中获取新值,那么他不会选择将属性作为函数参数传递。
vector
是函数
inputNames()
的返回类型。它告诉您函数将返回该类型的对象。在函数中,您可以从
names.txt
读取多个名称。通过拥有名称向量,您可以根据需要存储任意数量的名称,并且
vector
为您提供自动内存管理。但是,请阅读相同的问题,阅读答案,我希望这会帮助你为什么我们应该用不同于整数或浮点数的方法来对待向量或树?所有这些都是数据。你可以这样做。值得注意的是,使用第二种方法仍然是重用缓冲区的唯一合理方法。不过,与本例无关,是的。在这种情况下,这是一个进进出出的论点。虽然有用,但我只在几个地方使用过这个技巧,当它真的很重要的时候。经常更改为boost::containers::small_vector会使您更好地了解数据
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);
    }
}
std::vector<Name> names = inputNames();
std::vector<Name> names;
 // Other code
inputNames(names);