首页 > 解决方案 > 如何实现类似 std::copy_if 但在插入不同容器之前应用函数

问题描述

完全公开,这可能是一个锤子和钉子的情况,在不需要时尝试使用 STL 算法。我在我正在使用的一些 C++14 代码中看到了一种重新出现的模式。我们有一个迭代的容器,如果当前元素匹配某个条件,那么我们将其中一个元素字段复制到另一个容器。

模式类似于:

 for (auto it = std::begin(foo); it!=std::end(foo); ++it){
    auto x = it->Some_member;
    // Note, the check usually uses the field would add to the new container. 
    if(f(x) && g(x)){ 
      bar.emplace_back(x);
    }
  }

这个想法几乎是一种累积,所应用的函数并不总是返回一个值。我只能想到一个解决方案

这甚至是个好主意吗?

标签: c++stlc++14

解决方案


当然。有很多方法。

  1. 找一个图书馆transform_if,比如boost.

  2. 找到一个带有 的库transform_range,它接受一个转换和范围或容器,并返回一个具有转换值的范围。用copy_if.

  3. 找到一个filter_range像上面这样的库。现在,std::transform与您的过滤范围一起使用。

  4. 找到两者兼而有之的,并以适当的顺序组合过滤和转换。现在您的问题只是复制(std::copy或其他)。

  5. 编写您自己的反向插入器包装器,在插入时进行转换。将其与std::copy_if.

  6. 编写您自己的范围适配器,例如 2 3 和/或 4。

  7. transform_if


推荐阅读