示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题

Scope problem in the example code to split std::string to std::vector of strings using delimiter

本文关键字:std 拆分 vector 问题 范围 string 分隔符 代码      更新时间:2023-10-16

我在搜索要拆分的代码片段时发现了这个代码示例(类似于 PHP 的爆炸(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 的标准中使用它的方式:爆炸(字符串,分隔符(。

tokens变量确实不会在函数返回后幸存下来。 但是返回是按值返回的,并且返回的值在调用上下文中仍然存在。

对于优化,最好的方法是让编译器完成其工作,并仅在必要时进行微调。在这里,编译器可能会生成:

1(复制省略,将返回值直接构造到其目标中。 示例:
auto r=split(s, ' ');2( 如果目标先前已构造,则为移动分配。示例:
r=split(s, ' ');

这两种情况都避免了不必要的数据副本。 您可以在此处查看Test类以了解。

通过引用返回将是 UB,因为引用将引用不再存在的变量。因此,通过引用返回意味着使用引用参数直接写入正确的目标变量。 但这不会超过复制省略。 而且它可能很少会超过移动任务。 但是如果有疑问,您可以尝试制定基准。