3

私たちはこの地図を手に入れました:

std::map <int, int> values;

この関数は、Vectorのpush_back関数と同じでしょうか。

void PushBack(int value)
{
  values[values.size()] = value;
}

sizeはコンテナのサイズを返すので、正しいと思いました。次のシナリオによれば、次のようになります。index 0 = 200 index 1 = 150 100をプッシュバックする場合、values.size()は2を返します。したがって、通常のpush_backがインデックス2内に入るのと同じように、正しいでしょうか。

4

5 に答える 5

6

マップの要点は、データを一意に表すキーに基づいてデータを検索および保存することです。

これを行っている場合、マップを使用しても意味がありません。アプリケーションの設計ニーズにより適切に対応する別のデータ構造を選択する必要があります。

于 2013-03-08T13:56:49.050 に答える
2

マップとベクトルは大きく異なります。

あなたが尋ねた実際の質問への短いバージョン:

カスタマイズされたマップで行うのが既存のキー(operator [])とpush_backのキーベースのルックアップだけである場合、vectoroperator[]とpush_backのみを使用するvectorの非効率的なドロップイン置換のように機能する可能性があります。はい。

あなたがしていることがおそらく実際にはあなたが望んでいるものではない理由についての背景を提供する長いバージョン:

マップにはインデックスがなく、キーがあります。マップは通常、赤黒木として実装されます。このようなデータ構造により、キーに基づく効率的なルックアップが可能になります。通常、特定の要素のキーに関心があり、キー自体に重要な情報が含まれています。キーは通常連続しておらず、マップはマップで使用されていないキーにスペースを割り当てません。

ベクトルは、連続したメモリのブロックです。これにより、効率的なインデックス付きアクセスが可能になります。インデックスはキーと同じではありません。通常、特定の要素がどのインデックスを取得するかは気にせず、どのインデックスを取得するかは挿入の順序によって異なります(キーはマップ内の挿入順序とは無関係です)。ベクトルへのインデックスは常に整数値であり、連続していないインデックスを持つことはできません。

マップで行うのが独自のカスタムpush_backだけである場合、外部では、一部のコンテキストではベクトルのように機能するように見える場合があり、他のコンテキストでは機能しない場合があります(イテレーターの無効化など)。

例で追加される要素のキーは実際には気にしないため、マップの選択は無意味です。ベクトルでのインデックス付きルックアップは高速になり、メモリのオーバーヘッドは小さくなります(ただし、非常に多くのオブジェクトを割り当てると、メモリの断片化の問題が発生する可能性がありますが、それは別の主題です)。

そして最後に、使用するコンテナクラスがわからない場合は、vectorとlistから始めてください。これら2つの違いを理解し、どちらを使用する必要があるかを理解してから、マップ、セット、「マルチ」バリアント、「順序付けされていない」バリアントなど、より高度な特殊なコンテナに移動します。

于 2013-03-08T14:11:04.837 に答える
1

非常に特別な方法でのみマップを使用しない限り、それは正しくありません。このシナリオを考えてみましょう。

std::map<int, int> values;

values[1] = 42;
PushBack(7);

values7これで、インデックスに1つの要素のみが保持されます1

もちろん、問題は、「プッシュバック」が必要な場合、そもそもなぜマップを使用するのかということです。

于 2013-03-08T13:55:51.933 に答える
0

必要に応じpush_backて、の使用を検討してstd::vectorください。マップは連想配列であり、指定されたタイプのキーによる高速ルックアップを実行します。ベクトルのようにpush_backを実行するようには設計されていません。

于 2013-03-08T13:57:58.957 に答える
0

何を達成したいのか、なぜベクトルの代わりにマップを使用しようとするのかを言うのは難しいですが、より良い方法は次のようになります。

void PushBack(int value)
{
   int idx = 0;
   if( values.size() ) idx = values.rbegin()->first + 1;
   values[idx] = value;
}
于 2013-03-08T14:02:50.507 に答える