gpt4 book ai didi

c++ - 简化简单的 C++ 代码——类似于 Pythons any

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

现在,我有这段代码:

bool isAnyTrue() {
for(std::list< boost::shared_ptr<Foo> >::iterator i = mylist.begin(); i != mylist.end(); ++i) {
if( (*i)->isTrue() )
return true;
}

return false;
}

我曾经在这里使用过 Boost,但我真的不记得有什么简单的方法来编写它,有点像我可能会用 Python 编写它,例如:

def isAnyTrue():
return any(o.isTrue() for o in mylist)

STL/Boost 中是否有任何构造可以或多或少地像这样编写它?

或者可能等同于此 Python 代码:

def isAnyTrue():
return any(map(mylist, lambda o: o.isTrue()))

主要是我想知道在 Boost/STL 中是否有任何现有的 any(和 all)等价物。或者为什么没有(因为它看起来很有用而且我在 Python 中经常使用它)。

最佳答案

C++(还)没有foreach 结构。你必须自己写/

也就是说,您可以在此处使用 std::find_if 算法:

bool isAnyTrue()
{
return std::find_if(mylist.begin(), mylist.end(), std::mem_fun(&Foo::isTrue))
!= mylist.end();
}

此外,您可能应该使用 std::vectorstd::deque 而不是 std::list

编辑:sth 刚刚通知我,这实际上不会编译,因为您的列表包含 shared_ptr 而不是实际对象...因此,您你将需要编写自己的仿函数,或者依赖 boost:

//#include <boost/ptr_container/indirect_fun.hpp>

bool isAnyTrue()
{
return std::find_if(mylist.begin(), mylist.end(),
boost::make_indirect_fun(std::mem_fun(&Foo::isTrue))) != mylist.end();
}

注意,我还没有测试第二种解决方案。

关于c++ - 简化简单的 C++ 代码——类似于 Pythons any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3434582/

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