1

hash_map / unordered_mapに同じアイテムがロードされた場合、それらが繰り返されたときに同じ順序になることが保証されていますか?基本的に、ファイルからロードするハッシュマップがあり、そこから定期的に限られた数のアイテムをルーチンにフィードし、その後ハッシュマップを解放します。アイテムが消費された後、同じファイルをハッシュマップに再ロードし、前回停止した時点の後に次のアイテムのバッチを取得したいと思います。私が停止するポイントは、キーによって識別されます。

4

2 に答える 2

2

技術的にはいいえ、特定の順序であるとは限りません。

ただし、実際には、決定論的ハッシュ関数を使用することを考えると、やりたいことはうまくいくはずです。

検討

std::string name;
std::string value;

std::unordered_map <std::string, std::string> map1;
std::unordered_map <std::string, std::string> map2;

while (read_pair (name, value))
{
    map1[name] = value;
    map2[name] = value;
}

map1名前と値のペアmap2が同じ順序で並んでいることが合理的に期待できます。

于 2012-11-29T09:29:16.247 に答える
2

いいえ、安全に行うことはできません。まず、標準で保証されていませんが、標準を無視して実際の実装を見ても、それは悪い考えです。

ほとんどのハッシュ テーブル構造は履歴に依存しません。つまり、ハッシュ テーブルの状態は、含まれているアイテムだけでなく、それらが挿入された順序にも依存します。

具体的な例を次に示します。

#include <unordered_map>
#include <string>
#include <iostream>

static const char* const NAMES[] = {
    "joe",
    "bob",
    "alexander",
    "warren",
    "paul",
    "michael",
    "george",
    "david",
    "peter"
};
static const int NAME_COUNT = sizeof(NAMES)/sizeof(NAMES[0]);

static void print_umap(const std::unordered_map<std::string, int>& m) {
    for (const auto& item : m) {
        std::cout << "  " << item.first << "\n";
    }
}

int main(void) {
    std::unordered_map<std::string, int> a;
    std::unordered_map<std::string, int> b;
    std::unordered_map<std::string, int> c;

    for (int i = 0; i < NAME_COUNT; ++i) {
        a[NAMES[i]] = 0;
        b[NAMES[NAME_COUNT - 1 - i]] = 0;
    }

    for (const auto& item : a) {
        c[item.first] = 0;
    }

    std::cout << "a:\n";
    print_umap(a);
    std::cout << "\n\nb:\n";
    print_umap(b);
    std::cout << "\n\nc:\n";
    print_umap(c);
    return 0;
}

これをclangと C++ 標準ライブラリのlibc++実装を使用してビルドすると、次の出力が得られます。

a:
  peter
  george
  michael
  david
  paul
  bob
  warren
  alexander
  joe


b:
  joe
  alexander
  bob
  warren
  david
  paul
  michael
  george
  peter


c:
  joe
  alexander
  warren
  bob
  paul
  david
  michael
  george
  peter

順番は場合によって異なりますのでご注意ください。これは、ハッシュ テーブルではまったく珍しいことではありません。

于 2012-11-29T10:00:50.430 に答える