Получение позиции (int) QMap::iterator

Я написал модель на основе QListModel для доступа к данным, хранящимся в QMap. QMap гарантированно будет отсортирован. Таким образом, преобразование из QMap::iterator или const_iterator в int должно быть возможным и разумным.

На данный момент я уменьшаю итератор и увеличиваю переменную счетчика:

    QVariantMap::iterator it = m_data.upperBound(name); //or any other iterator
    int pos =  0;
    for (;it != m_data.begin();it--)
        pos++;
    //now pos contains the position of the entry at index in the map

Кажется, для некоторых структур данных определено int operator-(iterator), позволяющее int pos = it - m_data.begin(); есть ли что-то подобное для QMap?


person Simon Schmeißer    schedule 08.01.2016    source источник
comment
вероятно, нет, QMap, вероятно, будет реализован с двоичным деревом, поэтому нет операции O (1) для получения количества элементов между двумя узлами.   -  person ratchet freak    schedule 08.01.2016
comment
На самом деле меня больше беспокоит количество строк, чем производительность (n ‹ = 100), между прочим, это красно-черное дерево.   -  person Simon Schmeißer    schedule 08.01.2016


Ответы (1)


Я не знаком с QMap в частности, но обычно это самый простой алгоритм для определения ранга элемента на карте.

Предполагая, что итераторы Qt можно использовать со стандартными алгоритмами, вы можете упростить это до std::distance(m_data.begin(), it). В противном случае вы можете реализовать distance для итераторов QMap самостоятельно с алгоритмом, который вы показали.

person eerorika    schedule 08.01.2016