示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题
Scope problem in the example code to split std::string to std::vector of strings using delimiter
我在搜索要拆分的代码片段时发现了这个代码示例(类似于 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,因为引用将引用不再存在的变量。因此,通过引用返回意味着使用引用参数直接写入正确的目标变量。 但这不会超过复制省略。 而且它可能很少会超过移动任务。 但是如果有疑问,您可以尝试制定基准。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 将 std::大小为 m 的向量拆分为大小为 n 的向量
- 使用 std::regex 拆分一行并丢弃空元素
- 如何使用 std::enable_if 时拆分声明和实现
- 将一个std::数组拆分为一个较小大小的std::array元组
- 拆分 std::string 并插入到 std::set 中
- 将 std::map 的数据拆分为多个 std::vector
- std::vector 在代码拆分后引用要推送的对象失败
- C++--文件名中的前导零(CSV文件)--存储/拆分std::矢量的值
- 将 std::string 拆分为向量<string>的正确方法