map int< - > int,1:N,已知绑定

时间:2017-08-08 05:36:30

标签: c++ dictionary c++14 one-to-many

我被指派为游戏实施核心数据库。

这是int X <--> int Y的1:N地图。 (例如pirateship<->its turrets
我肯定知道0<=X<=10000<=Y<=10000 大多数指数被使用/占用,即密集。

某个X可以映射到多个Y 某个Y可以映射到0-1 X

我梦想有一个数据结构: -

  • 很少分配内存
  • 查询X->Y(返回Array<int>)和Y->X(快速返回int
  • 对于迭代,我不介意迭代0-10000的值Y

问题:

  • 我该如何实施?
  • 是否有适合我需要的标准库?
  • 此数据结构是否有自己的名称?

我糟糕的解决方案

  1. std::unordered_multimap<int,int>probably red-black tree)或std::unordered_map<int, std::vector<int>> (编辑:感谢一些程序员老兄)

    • 它很慢(个人资料):(
    • 不缓存友好
    • 未充分利用指数
  2. std::vector<int, std::vector<int>> - 我目前的做法

    • 值(std::vector<int>)需要大量动态分配
    • 潜在的缓存缺失和碎片 例如vector to store X=0 -> Y=?会远离vector to store X=1 -> Y=?
  3. 有没有更好的方法?

    对不起,如果这是一个常见问题,
    我无法找到与此完全匹配的任何内容。

1 个答案:

答案 0 :(得分:2)

这个怎么样?

typedef vector< int > Turrets;

struct PirateShip
{
    int ship;
    Turrets turrets;
};

typedef vector< PirateShip > Ships;

Ships pirates;

这样做,每艘船都有0到N个炮塔。

您可以将0从0放到容器内的船只上。

您只需更改typedef即可更改容器。

typedef set< PirateShip > Ships;

typedef list< PirateShip > Ships;

typedef deque< PirateShip > Ships;

你明白了。 : - )