我最近看到以下代码块作为对此问题的回复:Split a string in C++?
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;
}
为什么返回传递的引用数组“elems”在这里如此重要?我们不能使这个为void函数,或者返回一个整数来表示成功/失败吗?我们正在编辑实际的数组,对吗?
谢谢!
答案 0 :(得分:6)
通过返回对传入的对象的引用,您可以在一个表达式中执行一些链接或级联,并始终使用相同的向量。有些人觉得这个很有用:IE
std::vector<std::string> elems;
std::cout << "Number of items:" << split("foo.cat.dog", '.', elems).size();
// get just foo
std::cout << "First item is:" << split("foo.cat.dog", '.', elems)[0];
// change first item to bar
split("foo.cat.dog", '.', elems)[0] = "bar";
答案 1 :(得分:1)
它没有返回内存地址,它实际上是通过非const引用返回对象。它传入的方式相同。这可能看起来有点过分,因为调用代码可以依赖于传递的第三个参数,该参数将在从函数返回时填充,或者返回参数。
这样做的原因是允许链接。所以你可以这样做:
split(myString, ',', asAVector).size().
将执行该功能并允许您通过调用向量上的函数来链接结果(在本例中为size
)
尽管整洁,但这种方法存在一些潜在的缺点:例如,返回值中不存在错误代码,因此您依赖于函数正常工作或抛出异常;因此,您通常希望用try
/ catch
语义包含上述内容。当然,你做的链接越多,不同类型的异常的可能性就越大,所以你可能需要覆盖更多的catch
块。
请注意,通过引用传回来比通过指针传回要好得多。当链中的一个函数决定失败并返回0时,使用指针链接会因崩溃而臭名昭着。