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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Медленный QMap.keys()  (Прочитано 4753 раз)
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.305 секунд. Запросов: 22.