2012-04-26 14 views
0

は、いくつかの作業コードです:マップの最大効率的な挿入

std::pair<typename std::map< time_t, T >::iterator, bool> ret;  
ret = prt_map->insert (std::pair< time_t, T >(seconds , value)); 
if (ret.second == false) // exists 
{ 
... update exising value 
} 

私は、最大効率の挿入コードにアップグレードして--prt_map->エンド()から開始することの必要性を挿入するために先端を与えたいです。以下のようなもの:

prt_map->insert (--prt_map->end(), std::pair< time_t, T >(seconds , value)); 

しかしprototupeはSTDを返さないこの挿入機能::能力を持っているために、これを解決するためにどのように...そうだとすれば、既存および更新をチェックする(値の追加やないことを通知ブール値と対既存の値を更新する

+0

に定義されている(例えば、 'のstd :: unordered_map' )。 –

+0

@ n-m私はいつも新しいgccを使うことができないので、プログラムをコンパイルするときにシステム上でunordered_mapがサポートされなくなる可能性があります。 – abrahab

+0

'boost :: unordered_map'はほぼすべての場所でサポートされています。 –

答えて

5

a.insert(ヒント、t)の事後条件がある:。

キー要素が含ま

をtと同じであるのサイズがインクリメントされます1または0のいずれかです。

要素が挿入されているかどうかを判断するのに十分な情報でなければなりません。

+0

nice。今の質問は、より効率的なもの、私の最初の関数、または以前のサイズの値を要求して格納する関数であり、次に新しいサイズの値を要求+比較します。 – abrahab

0

キーがすでに存在する場合、2番目のバージョン(最初のバージョンと同じ)は値を更新しません。あなたはそれが実際に挿入/更新されたかどうかを確認することができます。

これは想定してい
std::map<time_t, T>::iterator ret = prt_map->insert(--prt_map->end(), 
    std::make_pair(seconds, value)); 
if (*ret != value) { 
    // the same key already exists, update value 
    *ret = value; 
} 

あなたが持っているoperator!=()あなたはおそらく、ハッシュテーブルを使用する効率を最大にするため、値型

+0

あなたは同じ値をチェックしますが、その値はotherである可能性があります。キーを確認する必要があります。キーが同じ場合にのみ更新します。 – abrahab

+0

返されたイテレータのキー_は、値を関連付ける値ですが、値が新しく挿入された場合、またはキーに関連付けられている既存の値がその値と同じになった場合にのみ同じ値になりますあなたが挿入したい – Attila

関連する問題