我想将字符串拆分功能用于此问题的最高评分答案:
为方便起见,复制答案:
#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
那有什么不同呢?
答案 0 :(得分:5)
返回引用允许调用split()
作为另一个函数的参数。例如,假设我们有一些其他函数通过引用接受字符串向量
void func(std::vector<std::string> &elements);
如果split()
返回引用,则可以将它直接返回的引用传递给func()
。
func(split(s, delim, elems));
然而,如果split()
没有返回引用,则需要执行
split(s,delim, elems);
func(elems);
如果split()
返回引用,第二种使用方法仍然有效。
这两者之间的区别纯粹是程序员的方便,但很多程序员更喜欢使用第一种调用方式。返回引用并不是一个特别昂贵的操作,因此允许程序员选择如何使用它并没有太大损失。
答案 1 :(得分:3)
它的语法糖使功能更加灵活。
例如:你可以写
std::cout << "there are " << split(str, delim, vect).size() << " elemements\n";
对于void
假设案例,您需要2个陈述。
答案 2 :(得分:1)
您发布的示例没有区别。
但是如果你想将它分配给另一个变量和/或将它传递给一个函数,可能会有。
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
。所以基本上是唯一的区别。
答案 3 :(得分:0)
从结果来看,这两种方法之间没有任何区别。
但是,选项1清楚地表明函数multA
具有计算结果并返回结果。
n1 = multA(n1);
另一方面,第二种选择并不像第一种选择那样不言自明。通过阅读以下代码,您无法轻松告诉multB
正在做什么。 multB
可能只是使用std::cout
记录结果。但是如果不阅读函数定义,你无法分辨。
multB(n2);