STL MAP应该使用查找()或[n]的识别符找到地图元素?(STL MAP should use

2019-06-24 10:32发布

我很困惑这是更有效?

正如我们可以直接访问地图,为什么我们需要用找?

我只需要知道哪种方式更有效。

#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;
}

提前致谢! :)

Answer 1:

使用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); }
}


Answer 2:

正如我们可以直接访问地图,为什么我们需要用找?

因为map<>::operator[]是有时讨厌。 如果一个元素不存在,那么:

  • 它插入它
  • 值初始化
  • 返回的值参考

因此,它总是返回的值是有效的引用,即使先前存在的关键din't。 这种行为并不打算多次。

在另一方面map<>::find()是安全的; 因为它返回的end()如果值不退出。 的另一个优点find()是,它返回它包含密钥(引用一个迭代器first )和价值( second )两种。



Answer 3:

在地图[]操作不是恒定它是对数的。 大部分的书籍强调这一事实,并指出这是一个有点误导。 因此,无论找到和[]经营者具有相同的复杂性。

请注意,[]操作将创建该条目,即使它不存在,同时发现将在这种情况下返回结束()。



Answer 4:

此代码和文档从采摘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”)与该按键映射插入一个新的元素并初始化为它的默认值(空字符串),即使它只是访问以检索其值。 会员功能地图::找到不会产生这种效果。



文章来源: STL MAP should use find() or [n] identifier to find element in map?