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, поскольку их базовые данные копируются при записи (в частности,).