2011-12-07 16 views
1

最後の質問から続けるC++ template class map私はいくつかの値を挿入する関数を実装しました。この関数は、ある範囲のキーに同じ値を挿入します。キーがマップに存在する場合は、古い値を上書きする必要があります。最終的に関数は正しく効率的ですか?あなたはそれを実装するより良い方法を提案できますか?テンプレートマップに挿入するC++関数

void insert_ToMap(K const& keyBegin, K const& keyEnd, const V& value) 
{ 
    if(!(keyBegin < keyEnd)) 
    return; 

    const_iterator it; 

    for(int j=keyBegin; j<keyEnd; j++) 
    { 
    it = my_map.find(j); 

    if(it==my_map.end()) 
    { 
     my_map.insert(pair<K,V>(j,value)); 
    } 
    else 
    { 
     my_map.erase(it); 
     my_map.insert(pair<K,V>(j, value)); 
    } 
    } 
} 

私は試してみてください。

int main() 
{ 
    template_map<int,int> Map1 (10); 

    Map1.insert_ToMap(3,6,20); 
    Map1.insert_ToMap(4,14,30); 
    Map1.insert_ToMap(34,37,12); 

    for (auto i = Map1.begin(); i != Map1.end(); i++) 
    { 
    cout<< i->first<<" "<<i->second<<std::endl; 
    } 
} 
+1

私はこれをコードレビューに投稿する必要があります。 – ScarletAmaranth

+0

何とかfor_eachを使うことができるのであれば、 "for"の代わりにプログラムはより多くのC++に見えるでしょう。 – rakesh

+0

私はちょうどあなたが消去せずに値を上書きする方法を示したと思った? –

答えて

4

キーが存在するかどうかを挿入するには:この構造はinsertはすでにfind()を行っているという事実を利用して、そして場合

typedef std:::map<K, V> map_type; 

std::pair<typename map_type::iterator, bool> p 
     = my_map.insert(std::pair<K const &, V const &>(key, new_value)); 

if (!p.second) p.first->second = new_value; 

挿入が失敗した場合は、直ちに結果のイテレータを使用して、マップされた値を上書きすることができます。


特定の隠れたコストがここにあります:挿入は常に要素のコピーを作成し、それが実際に成功したかどうか。でも、それを避けるために、我々は主張キーを検索し、同時に新しい要素の正しい挿入位置を提供するために、lower_bound()を使用して、もう少し詳細なアプローチを使用することができます。

insert()の2引数バージョンが一定で動作します挿入ヒント(最初の引数のイテレータ)が正確に挿入位置の場合は、lower_bound()が提供する時刻です。

+0

map_type :: iteratorの前に' typename'がありませんか? –

+0

@Armen: 'typename'の曖昧さは、テンプレート内でのみ使用でき、その名前がテンプレートパラメータに依存している場合にのみ許可されます。 –

+0

@ R.MartinhoFernandes:うん、まあ、関数へのKとVのテンプレートパラメータではなく、イテレータの従属名ではありませんか? –

関連する問題