Russian Qt Forum

Qt => Общие вопросы => Тема начата: MrDron от Сентябрь 04, 2017, 11:08



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


Название: Re: Медленный QMap.keys()
Отправлено: MrDron от Сентябрь 04, 2017, 11:30
Например, конструкцию QMap.keys().indexOf(key) можно заменить на:
Код:
QMap<Key, T> map;
std::distance(std::begin(map), map.find(key));
Так в разы быстрее.

Но это получение индекса по ключу, а вот наоборот ключа по индексу что то никак ничего подобного найти не могу.


Название: Re: Медленный QMap.keys()
Отправлено: Igors от Сентябрь 04, 2017, 11:40
Так в разы быстрее.
Тоже не блещет

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


Название: Re: Медленный QMap.keys()
Отправлено: MrDron от Сентябрь 04, 2017, 11:51
Тоже не блещет
Есть вариант быстрее?

А вообще надо было думать когда мапу заводили  - или переделывать те места где нужен индекс.
Пытаюсь оптимизировать чужой код.


Название: Re: Медленный QMap.keys()
Отправлено: __Heaven__ от Сентябрь 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();
 


Название: Re: Медленный QMap.keys()
Отправлено: __Heaven__ от Сентябрь 04, 2017, 14:51
Забудьте.
Код
C++ (Qt)
auto it = map.cbegin();
std::advance(it, index);
return it.key();


Название: Re: Медленный QMap.keys()
Отправлено: MrDron от Сентябрь 04, 2017, 15:19
Забудьте.
Код
C++ (Qt)
auto it = map.cbegin();
std::advance(it, index);
return it.key();
Спасибо. Так гораздо лучше! Что-то я как то упустил std::advance()


Название: Re: Медленный QMap.keys()
Отправлено: __Heaven__ от Сентябрь 04, 2017, 16:25
Можете также использовать cend() для того, чтобы ко второй половине мапы быстрее попасть.