如何在C++类中将所有私有向量换成私有地图

How do I swap out all my private vectors for private maps in a C++ class?

本文关键字:向量 地图 C++      更新时间:2023-10-16

我有一个场景类,用于游戏中的对象、摄像机和灯光

class Scene {
    private:
        std::vector<GameObject> objects;
        std::vector<Light> lights;
        // ... more containers ...

我正在尝试创建一个类接口,允许用户添加、删除、检索和迭代这些对象,而无需授予他们对底层容器(此时为向量)的特定访问权限。

    public:
        GameObject& get_game_object(const unsigned int id);
        void add_game_object(const GameObject& object);
        void remove_game_object(const unsigned int id);

在场景中添加、删除和检索对象工作正常。


但是,在尝试遍历这些游戏对象时,我遇到了一个问题。

    template<class T>
    void for_each_game_object(T t) const {
        std::for_each(begin(objects), end(objects), t);
    }

这个"包装器"适用于我的底层向量类。

scene.for_each_game_object([] (GameObject& object) {
    // do something in the lambda
});

但是现在我想将我的向量换成unordered_maps其中键是无符号整数,值是GameObject(或相机或灯光等)。

for_each_game_object循环现在需要不同的 lambda,并向最终用户公开键/值对。有没有办法重写 for_each_game_object 循环以迭代映射的值并忽略 id(由 Scene 类在内部使用)?

对于技术问题:传递一个函数(例如 lambda)来调用客户端代码的函子。

但请注意,对于向量,如果在给定索引处删除对象会移动以下对象的索引 (id),则映射的行为是不同的。因此,此更改可能会破坏现有的客户端代码。也就是说,问题可能不仅仅是适应 lambda 的技术问题。

此代码仅将函数映射到映射键/值对的值部分:

class Wrapper
{
public:
    void Apply(const std::function <void (const std::string)>& functor)
    {
        for (auto i : _Map)
        {
            functor(i.second);
        }
    }
private:
    std::unordered_map<int, std::string>    _Map;
};