Вопрос по c++, stl – STL MAP должен использовать find () или [n] идентификатор, чтобы найти элемент в карте?

9

Я запутался, что является более эффективным?

Поскольку мы можем получить прямой доступ к карте, зачем нам использовать 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   ответа
0

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 не производит этого эффекта.

1

он логарифмический. Большинство книг подчеркивают этот факт и указывают, что это немного вводит в заблуждение. Таким образом, операторы find и [] имеют одинаковую сложность.

Обратите внимание, что оператор [] создаст запись, даже если она не существует, в то время как find вернет end ().

3

Так какmap<>::operator[] иногда противно Если элемент не существует, тогда:

it inserts it value initialize it returns reference of value

Таким образом, он всегда возвращает действительную ссылку на значение, даже если ключ не существует ранее. Такое поведение не предназначено много раз.

С другой стороныmap<>::find() безопаснее; потому что это возвращаетend(), если значение не выходит. Еще одно преимуществоfind() является то, что он возвращает итератор, который содержит ссылки на ключ (first) и значение (second) и то и другое.

@jpalecek, да это было обменено. Спасибо
@ DavidRodr & gt; guez-dribeas, этоwrong, Так как нетif отметка в коде не означает, что она не нужна / не предназначена. Пример кода слишком локализован. В реальном мире нормальный кодер будет иметьfind() с последующимif состояние. Написание грязного кода для сохранения неопределенного поведения не является решением.
operator[] возвращает ссылку на значение, а не ключ.
@iammilind: я думаю, что проблема с определениемsafe, Я хочу сказать, что семантика отличается, и вы можете утверждать, чтоfind не будет изменять контейнер, но это не делаетfind операция безопаснее. Скорее на противоположном конце: сoperator[] вам гарантировано, что вы получите ссылку, так что этоsafe использовать его (да, он изменяет контейнер, нет, вы не вызываете неопределенное поведение), в то время как сfindкод пользователяneeds проверить возвращаемое значение, так как оно неsafe разыменовать это автоматически. Мнеmore error prone значит меньшеsafe.
map<>::find() is safer, Ну, на самом деле нет. Простейшим примером является код в вопросе, где пользователь не проверяет, действителен ли итератор. В этом конкретном случаеmap<>::operator[] являетсяsafer так как это гарантирует, что программа не имеет неопределенного поведения.
21

find означает, что вы случайно неcreate новый элемент на карте, если ключ не существует, и, что более важно, это означает, что вы можете использоватьfind искать элемент, если у вас есть толькоconstant ссылка на карту.

Это, конечно, означает, что вы должны проверить возвращаемое значение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); }
}
+1 Это абсолютно важно, если вы не хотите создавать элемент, если он не найден.

Похожие вопросы