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

标签 c++ python any

现在,我有这段代码:

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/

相关文章:

python - 如何在 Django 中保护 URL

python - 将 'any' 函数与列表压缩或生成器一起使用的正确语法

hashmap - 检查 Rust HashMap 中是否有任何值大于零

python - 在列表中搜索项目时如何使用 any 和 not (python)

c++ - C++ 如何检查一个数组是否等于任何其他数组?

c++ - 为什么我们需要 std::nullopt

c++ - 如何找到 -lm lib 并将其包含在 CMake 中?

c++ - 为什么我们可以在 C 中写越界?

python - Jupyter 单元卡在进程中 - 中断单元可以使操作成功

python - 在 python 中使用生成器和 cStringIO 来流式传输字符串