具有持久位置的C ++动态数据类型

时间:2015-07-25 15:42:01

标签: c++ pointers dynamic types

这个问题可能听起来有些荒谬,但也许可能。

首先是一些信息: 我正在为体素地形引擎创建一个块管理系统。 每个块必须能够访问其6个相邻块中的每一个。所以每个块都包含指向他的6个邻居的指针。这就是为什么块的内存位置不能改变的原因。目前我的设置如下:

ChunkMap chunks;                // unordered_map of chunks
ChunkSet createdChunks;         // set of pointers to unordered_map entries
ChunkSet generatedChunks;       // set of pointers to unordered_map entries
vector<Chunk*> renderedChunks;

由于unordered_map更改了其entrys的位置,这会导致错误,因为指向chunk邻居的指针正在访问错误的位置。

要点: 数据类型应

  • 有一个持久的记忆地址
  • 支持添加和删除未知的条目数
  • 尽可能高效

提前致谢!

1 个答案:

答案 0 :(得分:0)

持久的内存位置和动态大小不会同时发生(至少没有任何std::个容器)。

您有三个主要选择:

  1. 限制元素数量从开始(可能到大量)
  2. 将指针存储到对象而不是存储中的对象[这样,即使存储指针的位置发生更改,对象本身也会有一个固定的分配地址]。
  3. 创建自己的容器,分配&#34; lumps&#34;存储[某些合理的,优选固定的,大小],例如链接列表或块状矢量,以及存储数据。如果尺寸足够大[几千个元素],那么开销将是最小的。
  4. 任何容器的效率实际上取决于您正在进行的操作 - 在std::vector中插入和删除效率不高,但是遍历所有元素是。插入和删除在std::list中很好,但是从元素到元素的步行涉及指针追逐,这对效率不是很好。基于某些键查找std::map非常有效,插入/删除相对有效,但遍历所有内容与std::list类似。 std::unordered_map有点像std::vector用于插入[当它变得太大时,它会重新分配整个表格],但是找到特定元素的速度非常快。