在矢量上找到find_if并比较成员变量

时间:2012-12-23 23:06:22

标签: c++ algorithm boost stl

我有这样的课堂场景:

class Renderer;

class Scene
{
public:
    Scene(const std::string& sceneName);
    ~Scene();

    void Render(Renderer& renderer);

    Camera& GetSceneCamera() const;
    SceneNode& GetRootNode() const;
    const std::string& GetSceneName() const;


private:
    const std::string mName;
    Camera mSceneCamera;
    SceneNode mRootNode;
};

然后我有一个场景矢量(vector<Scene>)。

现在给出一个字符串,我想迭代这个场景矢量,如果在场景中找到名称,则返回指向它的指针。这是一个天真的尝试,但我收到了编译错误:

Scene* SceneManager::FindScene(const std::string& sceneName)
{
    return std::find_if(mScenes.begin(), mScenes.end(), boost::bind(&std::string::compare, &sceneName, _1));
}

Boost抱怨参数的数量,所以我的语法必须错误..这样做的正确方法是什么?

编辑:No instance of overloaded boost::bind matches the argument list

EDIT2:非C ++ 11

由于

2 个答案:

答案 0 :(得分:3)

让我们分一步。

find_if将为向量中的每个元素调用一个比较函数,当比较函数返回true时停止。该函数需要使用const Scene &参数进行调用。

我们可以写一个这样的(所有这些代码都是未经测试的)

struct SceneComparatorName {
    SceneComparatorName ( std::string &nameToFind ) : s_ ( nameToFind ) {}
    ~SceneComparatorName () {}
    bool operator () ( const Scene &theScene ) const {
        return theScene.GetSceneName () == s_;
        }
    std::string &s_;
    };

现在 - 你怎么写内联? 您boost::bind的尝试失败是因为您错过了对GetSceneName的调用,而您无法将Scene &std::string进行比较

在C ++ 11中,编写一个与上述结构完全相同的lambda很容易。

[&sceneName] (const Scene &theScene ) { return theScene.GetSceneName () == sceneName; }

但是你不想要c ++ 11,所以你必须写下这样的东西:

boost::bind ( std::string::operator ==, sceneName, _1.GetSceneName ());

但这不起作用,因为它会在调用bind中调用GetSceneName,而不是在调用bind创建的仿函数时调用。

但是,Boost.Bind支持重载运算符,因此您只需编写:

    boost::bind ( &Scene::GetSceneName, _1 ) == sceneName

完成。有关详情,请参阅http://www.boost.org/doc/libs/1_52_0/libs/bind/bind.html#nested_binds上的文档。

答案 1 :(得分:0)

最短路可能是手动循环:

BOOST_FOREACH(Scene& scene, mScenes) {
    if (scene.GetSceneName() == sceneName) return &scene;
}
return 0;