我想对这个问题的最高评价答案使用字符串拆分函数:
为方便起见复制答案:
#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/