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()
и проверяет это перед выполнением следующего поиска?
2 ответа
Я ожидаю, что QMap предоставляет обе функции для лучшего интерфейса с классом. Более естественно спрашивать, содержит ли карта значение с указанным ключом, чем вызывать функцию find.
Как показывает код, и находят, и содержат вызывают следующую внутреннюю функцию:
Node *n = d->findNode(akey);
Так что, если вы собираетесь использовать возвращенный итератор, тогда использование find и проверка возвращаемого значения будут более эффективными, но если вы просто хотите узнать, существует ли значение на карте, то вызов содержимого содержит больше для удобства чтения.
Если вы посмотрите на исходный код, то увидите, что QMap реализован в виде двоичной древовидной структуры узлов. Вызов findNode выполняет итерацию по узлам и не кэширует результат.
Исходный код QMap показывает, что в QMap::contains()
метод.
В некоторых случаях вы можете использовать QMap::value()
или же QMap::values()
получить значение для ключа и проверить, если он правильный. Эти методы (и const operator[]
) скопирует значение, хотя это, вероятно, нормально для большинства типов Qt, поскольку их базовые данные копируются при записи (особенно QMap
сам).