Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用返回通过引用传递的向量的实用程序_C++_String_Vector_Pass By Reference - Fatal编程技术网

C++ 通过引用返回通过引用传递的向量的实用程序

C++ 通过引用返回通过引用传递的向量的实用程序,c++,string,vector,pass-by-reference,C++,String,Vector,Pass By Reference,我最近看到以下代码块作为对这个问题的回答: std::vector和split(const std::string&s,char delim,std::vector &元素){ 标准::stringstream ss(s); std::字符串项; while(std::getline(ss,item,delim)){ 元素推回(项目); } 返回元素; } 为什么在这里返回通过引用传递的数组“elems”如此重要?我们不能将其设为一个void函数,或者返回一个整数来表示成功/失败吗?我们正在编

我最近看到以下代码块作为对这个问题的回答:

std::vector和split(const std::string&s,char delim,std::vector
&元素){
标准::stringstream ss(s);
std::字符串项;
while(std::getline(ss,item,delim)){
元素推回(项目);
}
返回元素;
}
为什么在这里返回通过引用传递的数组“elems”如此重要?我们不能将其设为一个void函数,或者返回一个整数来表示成功/失败吗?我们正在编辑实际的数组,对吗


谢谢大家!

通过返回对传入对象的引用,您可以在一个表达式中执行一些链接级联,并始终使用相同的向量。有些人认为这是一种习俗

  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";
std::向量元素;

std::cout它不是返回内存地址,而是通过非常量引用返回对象。同样的方式,它被传递进来。这似乎有点过分,因为调用代码可以依赖于传递的第三个参数(将在函数返回时填充),也可以依赖于返回参数

这样做的原因是允许链接。因此,您可以:

split(myString, ',', asAVector).size().
它将执行该函数,并允许您通过调用向量上的函数来链接结果(在本例中为
size

尽管整洁,但这种方法仍有一些潜在的缺点:例如,返回值中不存在错误代码,因此您依赖于函数提前工作或引发异常;因此,您通常希望用
try
/
catch
语义来包装上述内容。当然,链接越多,不同类型异常的可能性就越大,因此您可能需要覆盖更多的
catch


请注意,通过引用传回比通过指针传回要好得多。带指针的链接因链中的一个函数决定失败并返回0时崩溃而臭名昭著。

它实际上是通过引用返回向量,而不是内存地址。@Ben Decato仅供参考:如果您查看>运算符重载(任何地方)的实现,您会看到这样的链接。这些操作符接收一个流并返回对同一个流的引用,这样您就可以执行类似std::cout Thank you的操作——我编辑了文章的标题以反映这一新发现的知识。
split(myString, ',', asAVector).size().