gpt4 book ai didi

c++ - 如何实现类似 std::copy_if 但在插入到不同容器之前应用函数的方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:28 24 4
gpt4 key购买 nike

完全公开,这可能是一个锤子和钉子的情况,在不需要的时候尝试使用 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);
}
}

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

这是个好主意吗?

最佳答案

针对您的问题的一个非常通用的解决方案如下(工作示例):

#include <iostream>
#include <vector>
using namespace std;

template<typename It, typename MemberType, typename Cond, typename Do>
void process_filtered(It begin, It end, MemberType iterator_traits<It>::value_type::*ptr, Cond condition, Do process)
{
for(It it = begin; it != end; ++it)
{
if(condition((*it).*ptr))
{
process((*it).*ptr);
}
}
}

struct Data
{
int x;
int y;
};

int main()
{
// thanks to iterator_traits, vector could also be an array;
// kudos to @Yakk-AdamNevraumont
vector<Data> lines{{1,2},{4,3},{5,6}};

// filter even numbers from Data::x and output them
process_filtered(std::begin(lines), std::end(lines), &Data::x, [](int n){return n % 2 == 0;}, [](int n){cout << n;});

// output is 4, the only x value that is even

return 0;
}

它不使用 STL,这是正确的,但您只需传递一个迭代器对、要查找的成员和两个 lambdas/函数,它们将分别首先过滤和第二次使用过滤后的输出。

我喜欢您的一般解决方案,但在这里您不需要具有提取相应属性的 lambda。

显然,可以改进代码以与 const_iterator 一起使用,但我认为,对于一般概念,它应该会有所帮助。如果您想将此方法用于封装的类,您还可以将其扩展为具有返回成员属性而不是直接成员属性指针的成员函数。

关于c++ - 如何实现类似 std::copy_if 但在插入到不同容器之前应用函数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com