我只是偶然发现了Evan Teran在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;
}
这是好风格吗?我看到优势是直接使用结果,如
std::vector<std::string> vec;
unsigned int uiSize = split("ssad asda", ' ', vec).size();
而不是
std::vector<std::string> vec;
split("ssad asda", ' ', vec);
unsigned int uiSize = .size()
有任何缺点吗?据我所知,反对引用的主要原因是人们可能会返回一个在返回后被破坏的局部变量的引用。这不适用于此,因为该对象不是本地对象,而是作为参数赋予该方法。
答案 0 :(得分:2)
代码
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;
}
具有误导性的名称:它更多的是append_lines
而不是split
功能。
但鉴于此,返回对向量的引用是有意义的,是的。按值返回通常不会从移动语义中受益,因此会产生一些不必要的开销。并且void
结果可能会使调用代码非常笨拙&amp;别扭。