3

特定のキー値を置き換える必要がありますが、残りの部分はそのvalue_typeままにしておきます。私が実際に行う必要があるのは、値をコピーし、エントリを消去して、変更されたキー値で再度挿入することです。これは絶対にダメです。value_type 全体を 2 回コピーし、割り当て解除/割り当てを再度行う必要があります。

標準が次のようなメソッドを定義しない理由:

// returns count of exchanged keys
size_type exchange_key(key_type const& x, key_type const& y);
// returns count of replaced keys
size_type replace_key(key_type const& old_key, key_type const& new_key);

足りないものはありますか?

4

5 に答える 5

0

そもそもなぜ追加されなかったのかわかりませんし、あまりにも悪いことだと理解しています。絶対に必要だと感じたものを追加しただけだと思います。

Boost.MultiIndexがこの機能を提供したことをどこかで読んだことがあると思います。

于 2011-07-22T08:29:28.320 に答える
0

連想コンテナは、「キー」を効率的に変更できない方法で実装されています。これを明示するために、キーを置き換える便利なメソッドは提供されていません。連想コンテナも取り外して、カバーの下に再度挿入する必要があります。

于 2011-07-22T08:31:03.140 に答える
0

これは、キーを変更すると、連想コンテナーの構造に影響を与える可能性があるためです。特に、std::mapこれは典型的な赤黒ツリーであり、キーを変更すると (サブツリーのローテーションなど)、ほとんどのツリー構造が変更されます。一部のデータ構造では、そのような動的な変更でさえ許可されていません。そのため、このような操作を連想コンテナーの標準として公開することは困難です。

あなたが懸念しているオーバーヘッドに関しては、ポインタまたは参照として value_type を取得すると、ペアの削除/挿入のオーバーヘッドはそれほど悪くありません。

于 2011-07-22T08:33:47.117 に答える
0

まあ、正直なところ、画面の背後では挿入と削除の操作になりますが、値の部分がコピーされないという唯一の違いがあります。これはあなたの最大の関心事のようですが、オブジェクトのコピーが非常に重い場合を除き、大きなコンテナーでは、順序付けられたコンテナーを再安定化するための更新操作はとにかく重くなります。

これにはいくつかの重要な変更が必要になりますが、連想コンテナよりもさらに進んで、私が見ることができる最も重要な2つは次のとおりです。

  1. std::pair新しいペアを作成せずにキーを更新できる必要があるため (これにより、値オブジェクトもコピーされるため)、クラスを更新する必要があります。
  2. ツリーからペアを削除し、1. から新しいロジックを呼び出し、それを再挿入する更新関数が必要です。

std::pair現時点では実際には非常に単純なラッパーであるため、主な問題は最初のものにあると思います。あなたの提案はその原則を削除し、それに(不必要な)複雑さを追加します。また、call 2 は実際には新しい機能を追加するのではなく、参照などを通じて開発者が自分で簡単に管理できるシステムをラップすることに注意してください。このすべてのラッピングを std に追加すると、非常に巨大なライブラリの一部になります。

この原則が必要な場合は、より複雑なライブラリを探す必要があります (おそらくブーストにはいくつかあります)。または、単純に reference/shared_ptr を value_type として使用する必要があります。

于 2011-07-22T08:43:21.243 に答える