代码之家  ›  专栏  ›  技术社区  ›  KorbenDose

STD::用STD::ISTRESAMI-迭代器

  •  1
  • KorbenDose  · 技术社区  · 6 年前

    假设我有一个包含由空格分隔的数字的字符串。我想把这些数字插入一个整数向量,其中每个数字都减少一个。例如:

    "1 2 3 4" -> {0, 1, 2, 3}
    

    现在计划是使用 std::transform std::istream_iterator<int> ,如下所示:

    std::istringstream source{"1 2 3 4"};
    std::vector<int> target;
    
    std::transform(std::istream_iterator<int>(source),
                   std::istream_iterator<int>(),
                   std::begin(target),
                   [](int a) {
                     return a-1;
                   }
    );
    

    不幸的是,这不起作用,因为 STD::变换 预期 target 尺寸合适。所以我必须这么做

    std::vector<int> target(4);
    

    现在我有两个问题。我怎样才能动态地找到合适的尺寸 目标 事先?是否有更优雅的方式来实现实际目标?

    1 回复  |  直到 6 年前
        1
  •  4
  •   KorbenDose    6 年前

    在研究这个问题时,我找到了一个简单的解决方案。简单使用 std::back_inserter 作为输出迭代器而不是 std::begin(target) .

    std::transform(std::istream_iterator<int>(source),
                   std::istream_iterator<int>(),
                   std::back_inserter(target),
                   [](int a) {
                     return a-1;
                   }
    );
    

    另一个 solution 使用 std::for_each :

    std::for_each(std::istream_iterator<int>(source),
                  std::istream_iterator<int>(),
                  [&target](int a) {
                    target.push_back(a-1);
                  }
    );