1

私のプログラムでは、順序付けられていないキーが必要です。完了した仕事をするために、私は std::unordered_map コンテナを使用します。テストコードは次のとおりです。

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

int main()
{
    std::unordered_map<std::string, int> toto;

    toto["Outlook"] = 454;
    toto["Temperature"] = 4;
    toto["Humidity"] = 554;
    toto["Wind"] = 545454;

    std::unordered_map<std::string, int>::iterator It = toto.begin();

    std::cout << toto.size() << std::endl;

    for (; It != toto.end(); ++It)
        std::cout << (*It).first << std::endl;
    getchar();
    return (0);
}

Windows (Visual Studio 2012) では、出力は次のとおりです。

Outlook
Temperature
Humidity
Wind

それは正しいです。ソートは適用されていません。

ただし、Linux では、出力は次のようになります。

Humidity
Outlook
Wind
Temperature

PS : Linux では、プログラムを -std::c++0x および -std=gnu++0x でコンパイルしましたが、コンパイル エラーは発生しません。

では、同じプログラムで異なる動作を行うにはどうすればよいでしょうか? よろしくお願いいたします。

4

2 に答える 2

7

unordered_map通常(実際には常に読み取られます)ハッシュテーブルで実装され、デフォルトではstd::hash、アイテムを配置するバケットを選択するために使用されます.

多くの異なるハッシュ関数があるため、std::hashWindows と Linux での 2 つの異なる標準ライブラリの実装では、異なるハッシュ コードを生成する 2 つの異なるハッシュ関数を使用していることがわかります。繰り返した。

これが何を意味するのか理解できない場合は、一般的なハッシュ テーブルのデータ構造を調べることに時間を費やします。ハッシュは、プログラミングの多くの面で非常にクールで便利な数学ツールです。

于 2013-09-06T13:38:02.597 に答える
4

名前 (unordered_map) が示すように、コンテナーは順不同です。アイテムの順序がどうなるかについて誰も保証しません。実際には、実装ごとに順序が異なります。

于 2013-09-06T13:30:24.843 に答える