QMap:: contains() VS QMap:: найти()

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

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() и проверяет его перед выполнением следующий поиск?

2 ответов


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

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

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

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

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


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

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