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

标签 c++ string

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

Split a string in 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() 用作另一个函数的参数。例如,假设我们有一些其他函数可以通过引用接受字符串 vector

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

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

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

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

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

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

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

关于c++ - 为什么是 "std::vector<std::string> &"而不是 "void"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37364166/

相关文章:

c++ - 比较在终端中通过 char *argv[] 在 main 中传递的参数

python - pyopengl:它能取代 C++ 吗?

c++ - Qt Creator Ide,添加 QTcpSocket 实例后构建问题

java - 字符串连接: concat() vs "+" operator

c++ - 将 '\' 字符添加到字符串

python - PySchools - 主题 1 问题 7

c++ - 如何将 cmake 项目转换为 Visual Studio 等效项目?

c++ - 特定区间的有效搜索

string - 如何使用调用库函数节点将字符串传递回labview

java - 切割字符串java