为什么"std::vector<std::string> &"而不是"void"?

Why "std::vector<std::string> &" instead of "void"?

本文关键字:std void gt lt 为什么 string vector      更新时间:2023-10-16

我想使用字符串拆分函数来回答这个问题的最高评分:

C++拆分字符串?

为方便起见,复制答案:

#include <string>
#include <sstream>
#include <vector>
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}

std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}

我这里有一个问题。为什么声明是std::vector<std::string> &split(...)而不是void split(...)?作为论据,我们收到std::vector<std::string> &elems,这就是我们想要最终拥有的。如果我们收到引用,为什么要返回任何内容?

我有:

int &multA (int &n)
{
    n = 5*n;
    return n;
}
void multB (int &n)
{
    n = 5*n;
}

和:

int n1, n2;
n1 = 1;
n2 = 1;
cout << "n1: " << n1 << endl;
cout << "n2: " << n2 << endl;
n1 = multA(n1);
multB(n2);
cout << "n1: " << n1 << endl;
cout << "n2: " << n2 << endl;

结果我有:

n1: 1
n2: 1
n1: 5
n2: 5

那有什么区别呢?

返回引用允许将调用split()用作另一个函数的参数。 例如,假设我们有一些其他函数通过引用接受字符串向量

  void func(std::vector<std::string> &elements);

如果 split() 返回引用,则可以将其返回的引用直接传递给 func()

  func(split(s, delim, elems));

然而,如果split()没有返回引用,则有必要这样做

  split(s,delim, elems);
  func(elems);

如果split()返回引用,第二种使用方法仍然有效。

这两者之间的区别纯粹是程序员的方便,但很多程序员更喜欢使用第一种调用方式。 返回引用并不是一个特别昂贵的操作,因此允许程序员选择如何使用它不会损失太多。

语法糖使函数更加灵活。

通过示例:您可以编写

std::cout << "there are " << split(str, delim, vect).size() << " elemementsn";

对于void假设情况,您需要 2 个语句。

您发布的示例没有区别。

但是,如果您想将其分配给另一个变量和/或将其传递给函数,则可能会有。

int a = multA(n1); //In one line :)
foo(multA(na1));   //Same thing, one line only
multB(n1);
int a = n1; //Two lines
multB(n1);
foo(n1);    //Two lines

这里的multA显然更好,因为您可以将其写在一行中,而不是用 multB 写 2 行。所以基本上是唯一的区别。

就结果而言,这两种方法之间完全没有区别。

但是,选项 1 清楚地表明函数multA具有计算结果并返回该结果。

n1 = multA(n1);

另一方面,第二种选择不像第一种那样不言自明。通过阅读以下代码,您无法轻松判断multB正在做什么。multB可能只是用std::cout记录结果。但是不阅读函数定义就无法分辨。

multB(n2);
相关文章: