想想不同类型的集合,如Position
, Color
, Name
. 可以使用集合中的相同键连接这些实例。密钥是 64 位长度的全局唯一标识符。目前,我使用哈希映射,但这并不理想。
// custom types
struct Position { float x, y, z; bool static; };
enum Color { RED, BLUE, GREEN };
// collections
std::unordered_map<uint64_t, Position> positions;
std::unordered_map<uint64_t, Color> colors;
std::unordered_map<uint64_t, std::string> names;
// add some data
// ...
// only access positions collection,
// so the key is not needed here
for (auto i = positions.begin(); i != positions.end(); ++i) {
if (i->second.static) continue;
i->second.x = (rand() % 1000) / 1000.f;
i->second.y = (rand() % 1000) / 1000.f;
i->second.z = (rand() % 1000) / 1000.f;
}
// access to all three collections,
// so we need the key here
for (auto i = positions.begin(); i != positions.end(); ++i) {
uint64_t id = *i->first;
auto position = i->second;
auto color = colors.find(id);
auto name = names.find(id);
if (color == colors.end() || name == names.end()) continue;
draw(*name, *position, *color);
}
我尝试将集合分开,但正如您所看到的,同时也需要多个集合的收集实例。当然,我也需要不时添加或删除单个元素,但这些情况对性能并不重要。
现在我想优化对单个集合的迭代。因此,我尝试将集合连续存储,这是面向数据设计理念的一部分。但是,我仍然需要非常快速地访问各个实例。直接使用数组是行不通的,因为这会分配太多内存,而且并非一种类型的所有实例都有另一种类型的对应物。另一方面,哈希映射对于迭代来说不是最优的。
我认为数据结构必须在内部使用数组。我应该在这里使用哪种数据类型?C++标准库中是否实现了这样的数据结构?