crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Непонятки с QMap
trdm
  опции профиля:
сообщение 8.10.2009, 18:20
Сообщение #1


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Непонятки с QMap....
struct uoCell
{
    uoCell():m_nomber(0){};
    int m_nomber;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QDialog dlg;
    QMap<int,uoCell*> map;
    for (int i = 1; i<10; i++)
    {
        if (!map.contains(i)){
            uoCell* cell = new uoCell;
            cell->m_nomber = i;
            cout << "insert" << i;
            map.insert(i,cell);
        }
    }
    uoCell* cell2 = NULL;

    QMap<int,uoCell*>::iterator it = map.find(5);

    while(it != map.begin()){
        cell2 = it.value();
        cell2->m_nomber += 0;
        cout << "find" << cell2->m_nomber;
        --it;
    }


    dlg.show();


    return app.exec();
}


Казалось бы
while(it != map.begin()){
гарантирует, что найдется пара с m_nomber == 1
Ан нет, нефига....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
rnd
  опции профиля:
сообщение 9.10.2009, 10:11
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 54
Регистрация: 22.7.2009
Пользователь №: 930

Спасибо сказали: 1 раз(а)




Репутация:   0  


Нужно помнить, что map (QMap) сортирует элементы по ключу, именно поэтому к ключу предъявляется требование less-then comparable(т.е. определена операция <).
Поэтому при обычном переборе он и будет отдавать элементы в порядке возрастания ключей. А как он устроен внутри - дело второе.
Если порядок элементов не важен (или для ключа недоступна операция <) - можно пользоваться QHash

to SABROG, все-таки итераторы гораздо более универсальны, чем индексы. Индексы - это по сути только последовательные контейнеры, которые предоставляют произвольный доступ (vector, deque, в Qt QList).
А вот когда существует не один вариант обхода контейнера - итераторы рулят, например дерево:
post_order_iterator - узел после детей
pre_order_iterator - узел перед детьми
breadth_first_iterator - все узлы по уровням и т.п.

Кстати, rbegin(), rend() - простейшие примеры нестандартного обхода
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 21:23