2015-07-20 51 views
0

我想找到如何使用find_if来查找基于ID的场景结点,我不确定如何做虽然这C++ find_if - 如何找到一个ID(INT(

我能够例如,这样做是为了去除根据实际指针像这样的场景节点:

SceneNode::Ptr SceneNode::detachChild(const SceneNode& node) 
{ 
    auto found = std::find_if(mChildren.begin(), mChildren.end(), [&](Ptr& p) -> bool {return p.get() == &node; }); 
    ... 

,但我对如何处理find_if如果我找SceneNodes MID变量(这是一个INT)不确定

。 IE

SceneNode::Ptr SceneNode::findChild(int findID) 
{ 
    auto found = std::find_if(mChildren.begin(), mChildren.end(), ... ? = findID?; }); 
    ... 

有没有人有任何可以解释find_if的好网站或信息?谢谢!

+0

什么'mChildren'的声明?某种智能指针的容器? –

+2

你为什么删除lambda?你非常亲密......只需使用'.mID'访问成员?? –

回答

0

我想你想是这样的:

SceneNode::Ptr SceneNode::findChild(int findID) 
{ 
    auto found = std::find_if(std::begin(mChildren), std::end(m_children), 
     [=](Ptr& p) { return p->mID == findID; } 
    ); 

    // ... 
} 

这拉姆达将值捕捉findID,并将它与什么Ptr点的mID成员进行比较。

+0

在第一个例子中,似乎需要调用'Ptr :: get()'来获得一个实际的指针...... – defube

+1

如果它像'std :: shared_ptr',' - >'运算符超载。在这种情况下不需要'get()'。 –

+0

好点。至少在这些答案中的重复可能有点让人放心...:P – defube

1

你基本上有它...

auto found = std::find_if(
    mChildren.begin(), 
    mChildren.end(), 
    [&](Ptr& p) -> bool { return p->mID == node.mID; } 
); 
1

根据您的第一个例子,则显得Ptr &mChildren.begin().operator*()(或东西兼容)的结果。

所以:

SceneNode::Ptr SceneNode::findChild(int findID) 
{ 
    auto found = std::find_if(
     mChildren.begin(), mChildren.end(), 
     [findID](Ptr &ptr) 
     { 
      return findID == ptr.get()->mID; 
     }); 

    ... 
}