我在搜索代码片段以使用''(a Space :)的分隔符将std :: string拆分为子字符串向量时发现了这个代码示例。字符串示例-“一二三”。
std::vector<std::string> split(const std::string& s, char delimiter)
{
std::vector<std::string> tokens;
std::string token;
std::istringstream tokenStream(s);
while (std::getline(tokenStream, token, delimiter))
{
tokens.push_back(token);
}
return tokens;
}
我的问题是变量“令牌”的范围。使用这样的分割函数会不会出错,因为一旦函数返回,局部变量的作用域就会结束。我有一个解决问题的想法,只是不确定我的c ++技能。我对使用C ++ 0x的标准(例如explode(string,delimiter))的使用方式感到好奇。
该tokens
变量确实将无法生存函数的返回。但是返回是按值返回的,返回的值在调用上下文中仍然存在。
对于优化,最好的办法是让编译器执行其工作,并且仅在必要时进行微调。在这里,编译器可能会生成:
1)复制省略,将返回值直接构造到其目标中。示例:auto r=split(s, ' ');
2)如果目标已经预先构建,则进行移动分配。例:
r=split(s, ' ');
两种情况都避免了不必要的数据复制。您可以在这里看一下该Test
课程以进行理解。
通过引用返回将是UB,因为引用将引用不再存在的变量。因此,按引用返回将意味着使用引用参数直接写入正确的目标变量。但这不会胜过复制省略。而且它可能很少会胜过移动任务。但是如果有疑问,可以尝试进行基准测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句