首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用range-v3读取逗号分隔的数字列表。

使用range-v3读取逗号分隔的数字列表。
EN

Stack Overflow用户
提问于 2019-12-02 22:26:03
回答 2查看 1K关注 0票数 3

我想使用range(我使用range-v3实现)读取一个输入流,它是一个逗号分隔的数字列表。如果没有距离的话那是微不足道的,但是..。我以为这是解决问题的直截了当的办法:

代码语言:javascript
复制
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;
}

但这不能编译。我试过很多不同的方法,但似乎没有什么效果,我想这在几个方面都是错误的。有谁能告诉我我做错了什么,并解释一下该怎么做呢?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-02 23:06:06

什么

代码语言:javascript
复制
ranges::istream_view<int>(input)

做的是生成一个范围,这个范围相当于这个协同线(即使您不理解C++20协同线,希望这个示例足够简单,它可以理解这一点):

代码语言:javascript
复制
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
    }
}

这里有两个要点:

  1. --这是int的范围,所以不能将它放在字符串上。
  2. -它使用普通流>>,它不允许您提供自己的分隔符-它只停留在空格.

总之,istream_view<int>(input)为您提供了一系列的int,在输入中,它们由一个int组成:即42。下一个输入将尝试读取,并失败。

为了获得分隔的输入,可以使用getlines。这将为您提供一个带分隔符的string范围。它在内部使用std::getline。实际上,是这种协同作用:

代码语言:javascript
复制
generator<string> getlines(istream& input, char delim = '\n') {
    string s;
    while (std::getline(input, s, delim)) {
        co_yield s;
    }
}

然后,您需要将这些string转换为int

代码语言:javascript
复制
auto ints = ranges::getlines(input, ',')
          | ranges::view::transform([](std::string const& s){ return std::stoi(s); });
票数 4
EN

Stack Overflow用户

发布于 2019-12-02 23:07:25

代码语言:javascript
复制
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'}}

所以你可以这样做:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59147560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档