简化简单的 C++代码——类似于 Python 的任何代码

发布于 2024-09-13 08:41:21 字数 691 浏览 10 评论 0原文

现在,我有这样的代码:

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 中是否存在任何现有的任何(和所有)等效项。或者为什么没有(因为它看起来非常有用,而且我在 Python 中经常使用它)。

Right now, I have this code:

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

    return false;
}

I have used Boost here and then but I couldn't really remember any simple way to write it somewhat like I would maybe write it in Python, e.g.:

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

Is there any construct in STL/Boost to write it more or less like this?

Or maybe an equivalent to this Python Code:

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

Mostly I am wondering if there is any existing any (and all) equivalent in Boost / STL yet. Or why there is not (because it seems quite useful and I use it quite often in Python).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

野の 2024-09-20 08:41:21

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++ does not (yet) have a foreach construct. You have to write that yourself/

That said, you can use the std::find_if algorithm here:

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

Also, you should probably be using std::vector or std::deque rather than std::list.

EDIT: sth has just informed me that this won't actually compile because your list contains shared_ptr instead of the actual objects... because of that, you're going to need to write your own functor, or rely on 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();
}

Note, I haven't tested this second solution.

海螺姑娘 2024-09-20 08:41:21

我会使用自定义的any 而不是find_if。与 find_if 相比,我更喜欢它的可读性,但这是一个品味问题。

template<class ForwardIterator, class Pred>
bool any(ForwardIterator begin, ForwardIterator end, Pred pred) {
  for( ; begin != end; ++begin)
    if(pred(*begin)) return true;

  return false;

  //or
  //return std::find_if(mylist.begin(), mylist.end(), std::mem_fun(&Foo::isTrue))
  //       != mylist.end();

}

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

编辑:用 Billy ONeal 的 find_if 替代 any 。

Instead of find_if I'd go with a custom any. I like it better in terms of readability over find_if but that's a matter of taste.

template<class ForwardIterator, class Pred>
bool any(ForwardIterator begin, ForwardIterator end, Pred pred) {
  for( ; begin != end; ++begin)
    if(pred(*begin)) return true;

  return false;

  //or
  //return std::find_if(mylist.begin(), mylist.end(), std::mem_fun(&Foo::isTrue))
  //       != mylist.end();

}

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

Edit: Alternative any with find_if by Billy ONeal.

信仰 2024-09-20 08:41:21

新的C++标准有std::any_of,例如

bool isAnyTrue()
{
    return std::any_of(mylist.begin(), mylist.end(), std::mem_fn(&Foo::isTrue)); // Note std::mem_fn and not std::mem_fun
}

VS2010已经实现了这个。

The new C++ standard has std::any_of, e.g.

bool isAnyTrue()
{
    return std::any_of(mylist.begin(), mylist.end(), std::mem_fn(&Foo::isTrue)); // Note std::mem_fn and not std::mem_fun
}

VS2010 has this implemented.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文