QMap :: Содержит () VS QMap :: find ()

Я часто вижу такой код:

if(myQMap.contains("my key")){
myValue = myQMap["my key"];
}

который теоретически выполняет два поиска в QMap.

Моя первая реакция заключается в том, что он должен быть заменен следующим, который выполняет только один поиск и должен быть в два раза быстрее:

auto it = myQMap.find("my key");
if(it != myQMap.end()){
myValue = it.value();
}

Мне интересно, делает ли QMap эту оптимизацию автоматически для меня?
Другими словами, мне интересно, сохраняет ли QMap позицию последнего найденного элемента с QMap::contains() и проверяет это перед выполнением следующего поиска?

10

Решение

Я ожидаю, что QMap предоставляет обе функции для лучшего интерфейса с классом. Более естественно спросить, содержит ли карта значение с указанным ключом, чем вызвать функцию ‘find’.

Как показывает код, и find, и содержит вызов следующей внутренней функции: —

Node *n = d->findNode(akey);

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

Если вы посмотрите на исходный код, то увидите, что QMap реализован в виде двоичной древовидной структуры узлов. Вызов findNode выполняет итерацию по узлам и не кэширует результат.

5

Другие решения

Исходный код QMap показывает, что есть нет специального кода в QMap::contains() метод.

В некоторых случаях вы можете использовать QMap::value() или же QMap::values() получить значение для ключа и проверить, правильно ли оно. Эти методы (и const operator[]) скопирует значение, хотя, вероятно, это нормально для большинства типов Qt, поскольку их базовые данные копируются при записи (особенно QMap сам).

2

По вопросам рекламы [email protected]