Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка ключей мультимапа 
V
    Опции темы
kuvshinka
Дата 22.11.2012, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Код

   QMultiMap <ushort, void*> mmap;
    mmap.insert(94, NULL);
    mmap.insert(82, NULL);
    mmap.insert(8, NULL);
    mmap.insert(150, NULL);
   qDebug() << mmap.keys();


в итоговом листе мапа ключи автоматически отсортируются по возрастанию их значений...а как их не сортировать? то есть чтобы данные легли в лист мапа точно в порядке их записи в этот мап (нулевой элемент списка мапа=94, 2-ой=82 и т.д.)...если в мапе нельзя отключить сортировку данных, то подскажите другой контейнер для хранения данных, но жел-но в таком же виде - типа "<ключ, данные>"... пробовала QHash, но в него вообще непонятно как данные заносятся - и не сортируются, и не в порядке их записи...

Это сообщение отредактировал(а) kuvshinka - 22.11.2012, 19:22
PM MAIL   Вверх
Snake174
Дата 23.11.2012, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 5.10.2011
Где: Miass

Репутация: нет
Всего: нет



Попробуй использовать QVector<QPair<ushort, void*> > mmap;
PM MAIL   Вверх
kuvshinka
Дата 23.11.2012, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



понятно...попробую...то есть у мультимапа вообще никак нельзя отключить автосортировку ключей?
PM MAIL   Вверх
Jeka178RUS
Дата 23.11.2012, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

Репутация: нет
Всего: нет



Цитата(kuvshinka @ 23.11.2012,  05:25)
понятно...попробую...то есть у мультимапа вообще никак нельзя отключить автосортировку ключей?

Из доки:

QMap and QHash provide very similar functionality. The differences are:
QHash provides faster lookups than QMap. (See Algorithmic Complexity for details.)
When iterating over a QHash, the items are arbitrarily ordered. With QMap, the items are always sorted by key.
The key type of a QHash must provide operator==() and a global qHash(Key) function. The key type of a QMap must provide operator<() specifying a total order.

Так что если важен порядок элементов, а не быстрый доступ по ключу, тогда вам необходимо использовать контейнеры QList или QVector. Тут уж как удобнее контейнер пар элементов или два контейнера, но доступ к элементам будет линейным. Ну или можно хранить отдельно QMap и Vector ключей в нужном вам порядке, если памяти не жалко
PM MAIL   Вверх
kuvshinka
Дата 23.11.2012, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Код

 QVector <QPair<ushort, void*> > vec;
    vec.append(qMakePair((ushort)71,  (void*)NULL));
    vec.append(qMakePair((ushort)63,  (void*)NULL));
    vec.append(qMakePair((ushort)26,  (void*)NULL));
    vec.append(qMakePair((ushort)110, (void*)NULL));

подскажите пож-та правильный синтаксис команд indexof и contains:
Код

if  (vec.contains( QPair <(ushort)26, (void*)NULL>  )) - неверно 
qDebug() << vec.indexOf( QPair <((ushort)26, (void*)NULL)>  , 0); - неверно 



Код

    QMultiHash <ushort, void *> hh;
    hh.insert(71,  NULL);
    hh.insert(886, NULL);
    hh.insert(5,   NULL);
    hh.insert(99,  NULL);
    qDebug() << hh.keys();

ответ: (886, 71, 5, 99) 
так по какому же принципу (в каком порядке) записываются данные в QMultiHash? 

PM MAIL   Вверх
volatile
Дата 23.11.2012, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(kuvshinka @  23.11.2012,  20:08 Найти цитируемый пост)
так по какому же принципу (в каком порядке) записываются данные в QMultiHash? 

Кувшинка, везде где есть слово хеш, можно считать что в беспорядочном.

PM MAIL   Вверх
borisbn
Дата 24.11.2012, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(kuvshinka @  23.11.2012,  20:08 Найти цитируемый пост)
if  (vec.contains( QPair <(ushort)26, (void*)NULL>  )) - неверно 
qDebug() << vec.indexOf( QPair <((ushort)26, (void*)NULL)>  , 0); - неверно 

конечно неверно...
Код
qDebug() << vec.indexOf( qMakePair( (ushort)26, (void*)NULL ), 0 );

я бы посоветовал пользоваться stl-алгоритмами, т.к. в них можно задать предикат поиска. типа такого
Код

template< class PairType >
struct PairEqualByFirst {
    EqualByFirst( const PairType::first_type & f ) : m_first( f ) {}
    bool operator()( const QPair< PairType::first_type, PairType::second_type > & p ) {
        return p.first == m_first;
    }
private:
    PairType::first_type m_first;
};

typedef QVector <QPair<ushort, void*> > PairVector;
PairVector vec;
    vec.append(qMakePair((ushort)71,  (void*)NULL));
    vec.append(qMakePair((ushort)63,  (void*)NULL));
    vec.append(qMakePair((ushort)26,  (void*)NULL));
    vec.append(qMakePair((ushort)110, (void*)NULL));
PairVector::iterator = std::find_if( vec.begin(), vec.end(), PairEqualByFirst< PairVector::value_type >( 26 ) );

не проверял, но, возможно, где-то не хватает typename перед типом (привык, что студия поумнее гцц и не требует этого атавизма)

Это сообщение отредактировал(а) borisbn - 24.11.2012, 11:37


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kuvshinka
Дата 24.11.2012, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



понятно...и все-таки возвращаясь к мультимапу - а что тогда делает его фукнция setInsertInOrder? по названию вроде похоже на задание порядка записи данных в мап (мне бы как раз то что надо было бы)...почему-то описания этого метода нет...
PM MAIL   Вверх
kuvshinka
Дата 25.11.2012, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Jeka178RUS: а что будет быстрее работать - отдельно QMap с данными и Vector ключей к ним в нужном мне порядке ИЛИ вектор пары 
Код

QVector<QPair<ushort, void*> > mmap; 

PM MAIL   Вверх
Jeka178RUS
Дата 26.11.2012, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

Репутация: нет
Всего: нет



Цитата(kuvshinka @ 25.11.2012,  20:53)
Jeka178RUS: а что будет быстрее работать - отдельно QMap с данными и Vector ключей к ним в нужном мне порядке ИЛИ вектор пары 
Код

QVector<QPair<ushort, void*> > mmap; 


Смотря в том какой доступ для вас нужен:
1) Вас интересует доступ по ключу (или эта операция используется значительно чаще остальных), тогда вы используете QHash для доступа к элементам за константное время и поиск позиции ключа в массиве ключей за линейное время.

2) Порядок элементов первостепенен, тогда выборка из вектора по индексу за константное время, но поиск по ключу за линейное время. Тогда вектор пар удобнее, доступ к элементу пары всегда постоянен.

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

Это сообщение отредактировал(а) Jeka178RUS - 26.11.2012, 14:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0663 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.