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

如何在现代C++中用生成器初始化const容器?

  •  6
  • frans  · 技术社区  · 8 年前

    const

    const vector<int> input = {2, 13, 7, 1};
    

    我想做的是这样的事情:

    const auto transformed = generate_from<vector<string>>(
        input.begin(), input.end(), to_string);
    
    do_something(transformed);
    

    vector<string> bad_mutable_container;
    for (const auto & elem : input) {
        bad_mutable_container.push_back(to_string(input[elem]));
    };
    
    do_something(bad_mutable_container);
    

    C++ 11和更新提供 std::generate std::generate_n 但它们对一个可变的物体进行操作,所以它们不能解决我的问题:

    vector<string> bad_mutable_container(input.size());
    generate_n(bad_mutable_container.begin(), input.size(), [&input, n=0] () mutable {
        return to_string(input[n++]);
    });
    

    const auto transformed = [&input] {
        vector<string> bad_mutable_container;
        for (const auto & elem : input) {
            bad_mutable_container.push_back(to_string(elem));
        };
        return bad_mutable_container;
    } ();
    
    do_something(transformed);
    

    std::vector 我可以这样使用:

    const auto transformed = vector<string>(input.size(), [&input, n=0] () mutable {
        return to_string(input[n++]);
    });
    

    2 回复  |  直到 8 年前
        1
  •  10
  •   Jarod42    8 年前
    • boost::transform_iterator

      auto to_string_fun = [](const auto& e){ return std::to_string(e); };
      const std::vector output(boost::transform_iterator(input.begin(), to_string_fun),
                               boost::transform_iterator(input.end(), to_string_fun));
      

      Demo

    • range-v3 ,您可以这样做:

       const std::vector<std::string> output = input
           | ranges::view::transform([](int e){ return std::to_string(e); });
      

      Demo

        2
  •  3
  •   frans    8 年前

    Jarod42 boost::copy_range boost::adaptors::transformed range-v3

    const auto transformed = boost::copy_range<vector<string>>(
            input |
            boost::adaptors::transformed([] (const auto &elem) { 
                return to_string(elem);}));