4

これが私が実行しているコードで、g++4.6と-std=c++0x

std::unordered_map<int, int> um;

um.insert(std::make_pair(42, 43));
um.insert(std::make_pair(342, 343));
um.insert(std::make_pair(142, 143));
um.insert(std::make_pair(242, 243));

for(auto e : um)
std::cout << e.first << std::endl;

これは印刷します:

242
342
42
142

um.begin()->firstこれで、またはで242にアクセスできますum.begin(0)->first。342はを使用してアクセスできますum.begin(1)->first。しかし、um.begin(2)->firstまたはum.begin(3)->firstプログラムをクラッシュさせます。異なる番号でアクセスできましたum.begin(2)->first。私はその行動を自分自身に説明することはできません。um.begin(int)間違って使用しますか?

4

1 に答える 1

13

あなたはこれを非常に混乱させました。は、基になるハッシュテーブル構造内の特定のバケットbegin(1)にアクセスし、ローカルイテレータを返す順序付けされていないコンテナ専用の非常に特別な構造です。これは、ある種の「ランダムアクセス」方法で特定の要素にアクセスすることとは何の関係もありません。

順序付けされていないコンテナでできることは、コレクション全体またはfind特定の要素をキーごとに繰り返すことだけです。要素は特定の順序でアクセスできません。そのため、名前は「unordered」です。

ローカルイテレータを使用して各バケットを反復処理できます[begin(n), end(n))が、もちろん、空のコンテナを処理するには、任意の範囲で使用するのと同じイディオムを使用する必要があります。使用可能なバケットの総数は、bucket_countメンバー関数を使用して検出できます。

ほとんどの場合、バケットには0個または1個の要素が含まれていると予想する必要があることに注意してください。バケットあたりの平均要素数は、load_factorメンバー関数を介して利用可能(および構成可能)です。

于 2012-04-26T14:37:06.433 に答える