質問

を想定した地図がしたい既存作品の応募がありました。20%の時間にご入する新しいデータです。があるのに有利になってstd::地図:そのstd::地図::挿入する返される反復子?それともより早くように挿入し、それに基づき行動するか否かの反復子を示し、記録したり取り付けられていないとき?

役に立ちましたか?

解決

その答えがいもです。わんことを示唆する項目24 効果的なSTL による スコットMeyers:

typedef map<int, int> MapType;    // Your map type may vary, just change the typedef

MapType mymap;
// Add elements to map here
int k = 4;   // assume we're searching for keys equal to 4
int v = 0;   // assume we want the value 0 associated with the key of 4

MapType::iterator lb = mymap.lower_bound(k);

if(lb != mymap.end() && !(mymap.key_comp()(k, lb->first)))
{
    // key already exists
    // update lb->second if you care to
}
else
{
    // the key does not exist in the map
    // add it to the map
    mymap.insert(lb, MapType::value_type(k, v));    // Use lb as a hint to insert,
                                                    // so it can avoid another lookup
}

他のヒント

この回答によっても異なりますどのように高価なものを作るの値型ではない保存の地図

typedef std::map <int, int> MapOfInts;
typedef std::pair <MapOfInts::iterator, bool> IResult;

void foo (MapOfInts & m, int k, int v) {
  IResult ir = m.insert (std::make_pair (k, v));
  if (ir.second) {
    // insertion took place (ie. new entry)
  }
  else if ( replaceEntry ( ir.first->first ) ) {
    ir.second->second = v;
  }
}

のための価値の型などをintとしては、上記のより効率的ではなべの後に入らないのコンパイラの最適化).なお、上記の通り、この検索の地図だけます。

しかし、電話の挿入を必要とするだき,誠にありがとうござい新しい"価値"の構築:

class LargeDataType { /* ... */ };
typedef std::map <int, LargeDataType> MapOfLargeDataType;
typedef std::pair <MapOfLargeDataType::iterator, bool> IResult;

void foo (MapOfLargeDataType & m, int k) {

  // This call is more expensive than a find through the map:
  LargeDataType const & v = VeryExpensiveCall ( /* ... */ );

  IResult ir = m.insert (std::make_pair (k, v));
  if (ir.second) {
    // insertion took place (ie. new entry)
  }
  else if ( replaceEntry ( ir.first->first ) ) {
    ir.second->second = v;
  }
}

するための"挿入までの高価な通話を当社の価値型-からだいたいとの問いにこの新しい価値の20%ます。上記の場合、変更はマップ値タイプはオプションでは、より効率的に行索を確認する必要が生じた場合の構成要素となります。

これは、値型のマップに変更できる店舗を扱うためのデータ利用のお客様のお気に入りのスマートポインタ型です。に挿入する用途にnullポインタをも構築し、必要な場合は、新しいデータタイプを構築する。

あずに速度に差が生じる2見を返却する反復子を挿入しも同じように、検索、地図とにかくする場合には既に存在しています。

いです。その下にあります。私は常に挿入と更新して必要な場合は、あな取り扱いのペアを返します。

うまい探しを挿入し、余分なコストが必要となりますがない場合は、キーを挿入します。このように見書をアルファベット順に並を見つけていない書籍、それを通して見ているのも見どこへ挿入してください。をあげたどのようにお取り扱いますのキーの場合において、常に変化しています。現在はそれだけではありませんの柔軟性がない場合もログインすることができます、例外、い...

私は失われの答えになります。

見返します。end()っていることを確認してくださいかもしれませんので、何とを追加される場合は新しいものを

iter = map.find();
if (iter == map.end()) {
  map.insert(..) or map[key] = value
} else {
  // do nothing. You said you did not want to effect existing stuff.
}

生産することができとしてゆっくりとし

map.insert

任意の要素になっていない地図かできないものであり、それぞれ検索します。まだですが、再度、入力していただく部分にはすべての新しいものでした。

する場合は効率化する場合がありますチェック hash_map<>.

通常の地図<>どちらのバイナリーです。お客様の必要に応じて、hash_mapより効率的です。

っていなかったのでしょうか十分なポイントを残すコメントもチェックで解答が冗長にというと考えられますが挿入反復子を返しますとにかくへ行くのはなぜ検索lower_boundがご利用いただける反復子を返します。不思議に思います。

他の答えを約の効率化によっては、正確な実施のSTL.のようにベンチマークにしたものです。いらっしゃるかと思いることの差がうえで、重要な決定における意思決定スタイルとのスタイルします。

地図[キー]-let stlうです。ことになる通信のご意思を最も有効である。

ええ、公正で十分です。

う場合び挿入だけを行う2x O(log N)時のミスを見つけてきたが必要な場合は挿入しない場所に挿入するべき(lower_boundルだけを更新したいのですが--にあります。ただ直線を挿入し、その検討の結果のようになったと思い.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top