如何用C++及range-v3库将空格分隔数字字符串转为int向量?
问题:使用C++和range-v3将空格分隔字符串转为整数向量的编译错误解决
问题背景
需要将空格分隔的数字字符串转换为整数向量,尝试了以下代码但编译失败:
#include <iostream> #include <range/v3/all.hpp> using namespace std::literals; int main() { auto r = "1 1 2 3 5 8 13"sv | ranges::views::split(" "sv) | ranges::views::transform([](auto &&i){ return std::stoi(std::string{i}); }) | ranges::to<std::vector<int>>(); for (auto i: r) std::cout << "Value: " << i << std::endl; }
编译报错信息
repro-range.cpp:10:60: error: no matching constructor for initialization of 'std::string' (aka 'basic_string<char>') | ranges::view::transform([](auto &&i){ return std::stoi(std::string{i}); }) ^ ~~~
实际split返回的元素是子范围(subrange),并非直接的字符串对象,因此无法直接构造std::string;但直接转换为std::vector<std::string>能正常运行,说明问题出在transform环节的显式处理上。
解决方案
核心是显式将split输出的子范围转换为可被std::stoi处理的类型,以下是两种可行方法:
方法1:显式将子范围转为std::string
利用ranges::to<std::string>将子范围转换为字符串,再调用std::stoi:
#include <iostream> #include <range/v3/all.hpp> using namespace std::literals; int main() { auto r = "1 1 2 3 5 8 13"sv | ranges::views::split(" "sv) | ranges::views::transform([](auto&& subrange) { return std::stoi(ranges::to<std::string>(subrange)); }) | ranges::to<std::vector<int>>(); for (auto i : r) std::cout << "Value: " << i << std::endl; }
也可以直接用std::string的构造函数传入子范围的首尾迭代器:
| ranges::views::transform([](auto&& subrange) { return std::stoi(std::string(subrange.begin(), subrange.end())); })
方法2:无中间字符串的高效解析
如果想避免构造中间std::string的开销,可利用std::from_chars直接解析子范围的连续内存(原字符串是连续内存,子范围的字符也保持连续):
#include <iostream> #include <charconv> #include <range/v3/all.hpp> using namespace std::literals; int main() { auto r = "1 1 2 3 5 8 13"sv | ranges::views::split(" "sv) | ranges::views::transform([](auto&& subrange) { int val; std::from_chars(&*subrange.begin(), &*subrange.end(), val); return val; }) | ranges::to<std::vector<int>>(); for (auto i : r) std::cout << "Value: " << i << std::endl; }
补充说明
直接使用ranges::to<std::vector<std::string>>能正常运行,是因为range-v3的ranges::to会自动处理子范围到std::string的转换,内部完成了迭代器区间到字符串的构造,而手动写transform时需要显式处理这一步。
内容的提问来源于stack exchange,提问作者notsurewhattodo
相关产品推荐
相关产品推荐

