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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Медленный QMap.keys()  (Прочитано 575 раз)
MrDron
Новичок

Offline Offline

Сообщений: 19


Просмотр профиля
« : Сентябрь 04, 2017, 11:08 »

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

Offline Offline

Сообщений: 19


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

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

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

Сообщений: 9834


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

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

а вот наоборот ключа по индексу что то никак ничего подобного найти не могу.
Это нормально, нельзя найти то чего нет, ассоциативный контейнер предназначен для обращения по ключу (а не по индексу). Как меньшее из зол можно пробегаться итератором и считать индекс (сэкономите хоть на создании контейнера всякий раз). А вообще надо было думать когда мапу заводили  - или переделывать те места где нужен индекс.
Записан
MrDron
Новичок

Offline Offline

Сообщений: 19


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

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

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

Сообщений: 1968



Просмотр профиля
« Ответ #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

Сообщений: 1968



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

Забудьте.
Код
C++ (Qt)
auto it = map.cbegin();
std::advance(it, index);
return it.key();
Записан
MrDron
Новичок

Offline Offline

Сообщений: 19


Просмотр профиля
« Ответ #6 : Сентябрь 04, 2017, 15:19 »

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

Сообщений: 1968



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

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

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