11

どちらがより効率的か混乱していますか?

マップに直接アクセスできるのに、なぜ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;
}

前もって感謝します!:)

4

4 に答える 4

23

使用findするということは、キーが存在しない場合に誤ってマップに新しい要素を作成しないことを意味します。さらに重要なことは、これは、持っているのが常に参照しfindている場合に要素を検索するために使用できることを意味します。地図。

もちろん、これはの戻り値を確認する必要があることを意味します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); }
}
于 2012-05-14T11:07:10.303 に答える
4

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

map<>::operator[]時々厄介だからです。要素が存在しない場合:

  • それを挿入します
  • 値はそれを初期化します
  • 値の参照を返します

したがって、キーが以前に存在していなくても、常に有効な値の参照を返します。この動作は何度も意図されていません。

一方、map<>::find()より安全です。end()値が存在しない場合は、を返すためです。もう1つの利点は、key( )とvalue()の両方find()への参照を含むイテレータを返すことです。firstsecond

于 2012-05-14T11:07:17.670 に答える
2

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

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

于 2012-05-14T11:07:48.480 に答える
1

このコードとドキュメントは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.

(要素'd'への)最後のアクセスが、その値を取得するためだけにアクセスされた場合でも、そのキーを使用してマップに新しい要素を挿入し、デフォルト値(空の文字列)に初期化する方法に注意してください。メンバー関数map::findは、この効果を生成しません。

于 2012-05-14T11:11:47.153 に答える