通过引用传递的引用返回向量的效用

时间:2012-07-18 17:54:05

标签: c++ string vector pass-by-reference

我最近看到以下代码块作为对此问题的回复: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函数,或者返回一个整数来表示成功/失败吗?我们正在编辑实际的数组,对吗?

谢谢!

2 个答案:

答案 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时,使用指针链接会因崩溃而臭名昭着。