栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在C ++(STL)中求反函子?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在C ++(STL)中求反函子?

最好的解决方案是使用STL功能库。通过从导出谓词

unary_function<SomeType,bool>
,您将可以使用该
not1
函数,该函数恰好满足您的需要(即,否定一元谓词)。

这是您可以执行的操作:

struct FindPredicate : public unary_function<SomeType, bool>{    FindPredicate(const SomeType& t) : _t(t) {}    bool operator()(const SomeType& t) const {      return t == _t;    }private:    const SomeType& _t;};bool AllSatisfy(std::vector<SomeType>& v, SomeType& valueToFind){    return find_if(v.begin(),         v.end(),         not1(FindPredicate(valueToFind))) == v.end();}

如果您想推出自己的解决方案(恕我直言,不是最好的选择…),那么,您可以编写另一个谓词,即对第一个谓词的否定:

struct NotFindPredicate{    NotFindPredicate(const SomeType& t) : _t(t) {    }    bool operator()(SomeType& t) {      return t != _t;    }private:    const SomeType& _t;};bool AllSatisfy(std::vector<SomeType>& v) {    return find_if(v.begin(),         v.end(),         NotFindPredicate(valueToFind)) == v.end();}

或者您可以做得更好,编写一个模板函子求反器,例如:

template <class Functor>struct Not{    Not(Functor & f) : func(f) {}    template <typename ArgType>    bool operator()(ArgType & arg) { return ! func(arg); }  private:    Functor & func;};

您可以使用以下方法:

bool AllSatisfy(std::vector<SomeType>& v, SomeType& valueToFind){    FindPredicate f(valueToFind);    return find_if(v.begin(), v.end(), Not<FindPredicate>(f)) == v.end();}

当然,后一种解决方案更好,因为您可以在每个所需的函子中重用 Not 结构。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/637452.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号