无法对拆分后的字符串进行转换
我在尝试把一个字符串分割开来,然后用范围从输入中生成一个整数向量。
#include <string>
#include <vector>
#include <ranges>
std::string input;
std::vector data = std::views::split(input, " ") |
std::views::transform([](std::string &c)-> int {return std::stoi(c);});
在对上述代码进行编译时,出现编译错误,似乎是在把分割结果通过管道传递给transform时,针对模板重载 operator| 的问题被报出
<source>:6:58: error: no match for 'operator|' (operand types are 'std::ranges::split_view<std::ranges::ref_view<std::__cxx11::basic_string<char> >, std::ranges::ref_view<const char [2]> >' and 'std::ranges::views::__adaptor::_Partial<std::ranges::views::_Transform, <lambda(std::string&)> >')
6 | std::vector data = std::ranges::views::split(input, " ") |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
| |
| std::ranges::split_view<std::ranges::ref_view<std::__cxx11::basic_string<char> >, std::ranges::ref_view<const char [2]> >
7 | std::ranges::views::transform([](std::string &c)-> int {return std::stoi(c);});
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| std::ranges::views::__adaptor::_Partial<std::ranges::views::_Transform, <lambda(std::string&)> >
(随后是来自标准库的六个候选项)
Compiler Explorer链接: https://godbolt.org/z/oTGYabzo8
这是为什么?我该如何解决?
解决方案
从分割得到的是一个范围,而不是字符串。下面是实现的方法:
#include <iostream>
#include <ranges>
#include <string>
#include <vector>
int main() {
std::string input = "10 20 30 40";
std::vector<int> data =
input | std::views::split(' ') |
std::views::transform([](auto&& chunk) {
int result = 0;
auto [ptr, ec] = std::from_chars(
chunk.data(), chunk.data() + chunk.size(), result);
if (ec != std::errc{}) {
throw std::runtime_error{"Failed to parse int"};
}
return result;
}) |
std::ranges::to<std::vector>();
for (int e : data) {
std::cout << e << '\n';
}
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。