如何在c中实现类似for_each的函数?

如何在c中实现类似for_each的函数?,第1张

概述我需要实现一个for_each函数,如下所示.我知道std :: for_each可以将fn应用于每个元素,但我们不能删除std :: for_each中的元素.我需要扩展这个模板函数,这样在fn中,调用者可以同时访问元素和擦除元素.有没有正确的方法来做到这一点? #include <iostream>#include <vector>#include <algorithm>using na 我需要实现一个for_each函数,如下所示.我知道std :: for_each可以将fn应用于每个元素,但我们不能删除std :: for_each中的元素.我需要扩展这个模板函数,这样在fn中,调用者可以同时访问元素和擦除元素.有没有正确的方法来做到这一点?

#include <iostream>#include <vector>#include <algorithm>using namespace std;class A{public:    explicit A(){        mVec.clear();    }    ~A(){}    template<class T> voID for_each(T fn)    {        for(size_t i = 0; i < mVec.size(); ++i)        {            //fn can erase element or just visit element            fn(mVec[i]);        }    }    vector<int> mVec;};int main(){    A test;    for(int i = 0; i < 8; ++i)    {        test.mVec.push_back(i);    }    test.for_each([&test](int i){        if (i % 2 == 0)        {            cout << i << " deleted" << endl;            test.mVec.erase(find(test.mVec.begin(),test.mVec.end(),i));        }         else        {            cout << i << " parse" << endl;        }    });    system("pause");    return 0;}

编辑:在for_each模板函数中,我们不知道调用者是否会删除元素.擦除元素在fn中完成

解决方法 你可以从函数返回一个bool值,其中true表示“擦除元素”?然后你的for_each函数变成了类似的东西.

size_t i = 0;    for(size_t j = 0; j < mVec.size(); ++j) {        if (!fn(mVec[j])) {            // The element must be kept            if (i != j)                mVec[i] = std::move(mVec[j]);            i++;        }    }    mVec.resize(i);

优点还在于,无论擦除多少元素,它总是O(n).

编辑:上面的循环实际上只是std :: remove_if(),所以@ChenOT的建议是最好的.另外

n = std::remove_if(mVec.begin(),mVec.end(),fn) - mVec.begin();    mVec.resize(n);
总结

以上是内存溢出为你收集整理的如何在c中实现类似for_each的函数?全部内容,希望文章能够帮你解决如何在c中实现类似for_each的函数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1228004.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存