2012-05-14 3 views
6

これは効率的ですが混乱していますか?STL MAPは、マップ内の要素を見つけるためにfind()または[n]識別子を使用する必要がありますか?

私たちはマップに直接アクセスできるので、なぜfindを使用する必要がありますか?

どの方法がより効率的であるかを知る必要があります。

#include <iostream> 
#include <map> 
using namespace std; 

int main() 
{ 
    map<char,int> mymap; 
    map<char,int>::iterator it; 

    mymap['a']=50; 
    mymap['b']=100; 
    mymap['c']=150; 
    mymap['d']=200; 

    //one way 

    it=mymap.find('b'); 
    cout << (*it).second <<endl; 

    //another way 
     cout << mymap['b'] <<endl; 

    return 0; 
} 

ありがとうございました!もっと重要なのは - - これはあなたがルックアップするためにfindを使用できることを意味:) findを使用して

答えて

18

は、キーが存在し、しない場合は、不注意にマップ内の新しい要素を作成しないことを意味し要素がある場合は、定数のマップを参照してください。

もちろん、戻り値findを確認する必要があります。一般的に、それはこのように書きます:私たちは、直接マップにアクセスすることができたよう

void somewhere(const std::map<K, T> & mymap, K const & key) 
{ 
    auto it = mymap.find(key); 
    if (it == mymap.end()) { /* not found! */ } 
    else     { do_something_with(it->second); } 
} 
+2

+1これは、要素が見つからない場合、作成したくない場合は絶対に重要です。 –

2

、なぜ我々は見つける使用する必要がありますか?

map<>::operator[]はときどき厄介です。要素が存在しない場合:

  • それは
  • 値は、それが値

  • 戻り参照は従ってそれは常に場合でも、値の有効な参照を返す初期化し、それを挿入します以前は存在しませんでした。この動作は何度も意図されたものではありません。

    一方、map<>::find()はより安全です。値が終了しない場合はend()を返します。 find()のもう1つの利点は、キー(first)と値(second)の両方への参照を含むイテレータを返すことです。

  • +0

    'operator []'は、キーではなく値への参照を返します。 – jpalecek

    +0

    @jpalecek、それは交換されました。 Thx – iammilind

    +0

    * 'map <> :: find()'は安全です*。まあ、実際にはない。最も簡単な例は、ユーザーがイテレータが有効かどうかを確認していない質問のコードです。この特定の場合、 'map <> :: operator []'はプログラムが未定義の動作をしないことを保証するので、* safer *です。 –

    1

    マップの[]演算子は定数ではなく、対数です。本のほとんどはこの事実を強調し、それは少し誤解を招くことを指摘している。したがって、findと[]演算子は同じ複雑さを持ちます。

    []演算子は、存在しない場合でもエントリを作成しますが、findはその場合にend()を返します。

    0

    このコードとドキュメントは(空を(要素「D」への)最終アクセスは、そのキーでマップに新たな要素を挿入する方法cplusplus.com

    // accessing mapped values 
    #include <iostream> 
    #include <map> 
    #include <string> 
    using namespace std; 
    
    int main() 
    { 
        map<char,string> mymap; 
    
        mymap['a']="an element"; 
        mymap['b']="another element"; 
        mymap['c']=mymap['b']; 
    
        cout << "mymap['a'] is " << mymap['a'] << endl; 
        cout << "mymap['b'] is " << mymap['b'] << endl; 
        cout << "mymap['c'] is " << mymap['c'] << endl; 
        cout << "mymap['d'] is " << mymap['d'] << endl; 
    
        cout << "mymap now contains " << (int) mymap.size() << " elements." << endl; 
    
        return 0; 
    } 
    
    OP: 
    mymap['a'] is an element 
    mymap['b'] is another element 
    mymap['c'] is another element 
    mymap['d'] is 
    mymap now contains 4 elements. 
    

    お知らせからピックアップし、そのデフォルト値に初期化されます文字列)を返します。メンバー関数map :: findはこの効果を生成しません。

    関連する問題