Russian Qt Forum
Мая 18, 2025, 17:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Медленный QMap.keys()  (Прочитано 4910 раз)
MrDron
Гость
« : Сентября 04, 2017, 11:08 »

Здравствуйте! Нужно получить key по индексу. Сейчас используется конструкция QMap.keys().at(index).
Есть ли возможность обойти вызов keys() у QMap? Т.к. он очень затратный, при каждом вызове создается новый QList<key> и удаляется.
Записан
MrDron
Гость
« Ответ #1 : Сентября 04, 2017, 11:30 »

Например, конструкцию QMap.keys().indexOf(key) можно заменить на:
Код:
QMap<Key, T> map;
std::distance(std::begin(map), map.find(key));
Так в разы быстрее.

Но это получение индекса по ключу, а вот наоборот ключа по индексу что то никак ничего подобного найти не могу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентября 04, 2017, 11:40 »

Так в разы быстрее.
Тоже не блещет

а вот наоборот ключа по индексу что то никак ничего подобного найти не могу.
Это нормально, нельзя найти то чего нет, ассоциативный контейнер предназначен для обращения по ключу (а не по индексу). Как меньшее из зол можно пробегаться итератором и считать индекс (сэкономите хоть на создании контейнера всякий раз). А вообще надо было думать когда мапу заводили  - или переделывать те места где нужен индекс.
Записан
MrDron
Гость
« Ответ #3 : Сентября 04, 2017, 11:51 »

Тоже не блещет
Есть вариант быстрее?

А вообще надо было думать когда мапу заводили  - или переделывать те места где нужен индекс.
Пытаюсь оптимизировать чужой код.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Сентября 04, 2017, 14:46 »

Могу предложить попробовать что-то вроде:
Код
C++ (Qt)
int currentIndex = 0;
for (auto it=map.cbegin(), end = cend(); it != end; ++it, ++currentIndex) {
   if (currentIndex == index) {
       return it->key();
   }
}
return EmptyKey();
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Сентября 04, 2017, 14:51 »

Забудьте.
Код
C++ (Qt)
auto it = map.cbegin();
std::advance(it, index);
return it.key();
Записан
MrDron
Гость
« Ответ #6 : Сентября 04, 2017, 15:19 »

Забудьте.
Код
C++ (Qt)
auto it = map.cbegin();
std::advance(it, index);
return it.key();
Спасибо. Так гораздо лучше! Что-то я как то упустил std::advance()
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Сентября 04, 2017, 16:25 »

Можете также использовать cend() для того, чтобы ко второй половине мапы быстрее попасть.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.