2

PositionColor、などのさまざまなタイプのコレクションを考えてみてください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);
}

コレクションを分離しようとしていますが、ご覧のとおり、複数のコレクションの収集されたインスタンスが同時に必要になることもあります。もちろん、時々 1 つの要素を追加または削除する必要もありますが、これらのケースはパフォーマンス クリティカルではありません。

ここで、個々のコレクションの反復処理を最適化したいと考えています。したがって、コレクションを連続して保存するようにしています。これは、データ指向設計の考え方の一部です。ただし、個々のインスタンスに非常に迅速にアクセスする必要があります。配列を直接使用すると、あまりにも多くのメモリが割り当てられ、あるタイプのすべてのインスタンスが別のタイプの対応するインスタンスを持つとは限らないため、機能しません。一方、ハッシュマップは反復には最適ではありません。

データ構造は内部的に配列を使用する必要があると思います。ここではどのデータ型を使用すればよいですか? また、C++ 標準ライブラリに実装されているそのようなデータ構造はありますか?

4

1 に答える 1