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

如何从一个容器中提取某些元素并将这些元素的转换插入到另一个容器中?

  •  2
  • Adrian  · 技术社区  · 7 年前

    我有一个 vector<int*> 我想把所有指向的元素放到一个 vector<int> nullptr

    vector<int> copy_valid_elements(vector<int*> piv)
    {
     vector<int> result;
     result.reserve(piv.size());
     auto end_it = std::remove_if(piv.begin(), piv.end(), [](int* p) { return !p; });
     std::transform(piv.begin(), end_it, back_inserter(result), [](int* p) { return *p; });
     return result;
    }
    

    但这需要在数组中不必要地移动元素。我可以做一个for循环,但我希望有一个算法是 std::copy_if std::transform . 有这样的野兽吗?

    1 回复  |  直到 7 年前
        1
  •  6
  •   lubgr    6 年前

    下面是一个应用可选转换的函数模板,其中包含两个谓词:一个用于过滤,另一个用于实际映射。

    template <class InpIt, class OutIt, class Pred, class Fct>
    OutIt transform_if(InpIt first, InpIt last, OutIt dest, Pred pred, Fct transform)
    {
       while (first != last) {
          if (pred(*first))
             *dest++ = transform(*first);
    
          ++first;
       }
    
       return dest;
    }
    

    你可以这样称呼它

    int n1 = 1, n2 = 2, n3 = 3;
    
    std::vector<int*> input{&n1, nullptr, nullptr, nullptr, &n2, &n3, nullptr};
    std::vector<int> result;
    
    transform_if(input.cbegin(), input.cend(), std::back_inserter(result),
        [](auto *i){ return i != nullptr; }, [](auto *i){ return *i; });
    

    #include <boost/range/adaptors.hpp>
    #include <boost/range/algorithm.hpp>
    
    using namespace boost::adaptors;
    
    /* Variable setup as above... */
    
    boost::copy(input | filtered([](auto *i){ return i != nullptr; }) | indirected,
        std::back_inserter(result));