我想使用range(我使用range-v3实现)读取一个输入流,它是一个逗号分隔的数字列表。如果没有距离的话那是微不足道的,但是..。我以为这是解决问题的直截了当的办法:
auto input = std::istringstream("42,314,11,0,14,-5,37");
auto ints = ranges::istream_view<int>(input) | ranges::view::split(",");
for (int i : ints)
{
std::cout << i << std::endl;
}但这不能编译。我试过很多不同的方法,但似乎没有什么效果,我想这在几个方面都是错误的。有谁能告诉我我做错了什么,并解释一下该怎么做呢?
提前感谢!
发布于 2019-12-02 23:06:06
什么
ranges::istream_view<int>(input)做的是生成一个范围,这个范围相当于这个协同线(即使您不理解C++20协同线,希望这个示例足够简单,它可以理解这一点):
generator<int> istream_view_ints(istream& input) {
int i;
while (input >> i) { // while we can still stream int's out
co_yield i; // ... yield the next int
}
}这里有两个要点:
int的范围,所以不能将它放在字符串上。>>,它不允许您提供自己的分隔符-它只停留在空格.。
总之,istream_view<int>(input)为您提供了一系列的int,在输入中,它们由一个int组成:即42。下一个输入将尝试读取,并失败。
为了获得分隔的输入,可以使用getlines。这将为您提供一个带分隔符的string范围。它在内部使用std::getline。实际上,是这种协同作用:
generator<string> getlines(istream& input, char delim = '\n') {
string s;
while (std::getline(input, s, delim)) {
co_yield s;
}
}然后,您需要将这些string转换为int。
auto ints = ranges::getlines(input, ',')
| ranges::view::transform([](std::string const& s){ return std::stoi(s); });发布于 2019-12-02 23:07:25
std::string input = "42,314,11,0,14,-5,37";
auto split_view = ranges::view::split(input, ",");将产生一系列范围:
{{'4', '2'}, {'3', '1', '4'}, {'1', '1'}, {'0'}, {'1', '4'}, {'-', '5'}, {'3', '7'}}。
所以你可以这样做:
std::string input = "42,314,11,0,14,-5,37";
auto split_view = ranges::view::split(input, ",");
for (auto chars : split_view) {
for (auto c : chars) {
std::cout << c;
}
std::cout << std::endl;
}https://stackoverflow.com/questions/59147560
复制相似问题