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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отсортировать QVector  (Прочитано 13222 раз)
Alex_C
Гость
« : Июнь 19, 2012, 16:48 »

Есть
Код
C++ (Qt)
 stuct PrefixRecord
{
 QString s1;
 QString s2;
}
 
QVector<PrefixRecord> *s = new QVector<PrefixRecord>;
s->resize(1000);
 

Далее я заполнил эту структуру и мне ее нужно отсортировать по s->s1;
Нашел в документации такой вариант с использованием QMap:

Код
C++ (Qt)
QStringList list;
list << "AlPha" << "beTA" << "gamma" << "DELTA";
 
QMap<QString, QString> map;
foreach (const QString &str, list)
    map.insert(str.toLower(), str);
 
list = map.values();
 

Пытаюсь сделать аналогично:
Код
C++ (Qt)
prefixRecords = new QVector<PrefixRecord>;
// тут заполняем структуру
 
   QMap<QString, PrefixRecord> map;
   foreach (const PrefixRecord &p, prefixRecords)
       map.insert(p.s1, prefixRecords);
   prefixRecords = map.values();
 

Ругается на foreach
ошибка: 'QVector<PrefixRecord>*' is not a class, struct, or union type
Понимаю, что не правильно использую foreach, до этого особо с ним дела не имел. Подскажите, как правильно?
Записан
alexis031182
Гость
« Ответ #1 : Июнь 19, 2012, 16:57 »

С итератором надо, foreach не примет QMap
Записан
mutineer
Гость
« Ответ #2 : Июнь 19, 2012, 16:58 »

какой ад. используй qSort
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 19, 2012, 17:01 »

Ругается на foreach
ошибка: 'QVector<PrefixRecord>*' is not a class, struct, or union type
Понимаю, что не правильно использую foreach, до этого особо с ним дела не имел. Подскажите, как правильно?
Ну да, указатель не структура, нужно разыменовать (*prefixRecords)

По поводу foreach. Наверное когда-то норвежскому программисту понравилась эта конструкция, его вины в этом нет. Но стоит ли это бездумно копировать. чем оно лучше? По мне так ничем, шифрует текст и заставляет ломать голову без нужды.

Код
C++ (Qt)
for (int i = 0; i < list.size(); ++i)
    map.insert(list[i].toLower(), list[i]);
 
Записан
Alex_C
Гость
« Ответ #4 : Июнь 19, 2012, 17:08 »

Читаю документацию, однако))) а там

An alternative to using qSort() is to put the items to sort in a QMap, using the sort key as the QMap key. This is often more convenient than defining a lessThan function.

Я так понимаю, что нефиг извращаться и воспользоваться

void qSort ( RandomAccessIterator begin, RandomAccessIterator end, LessThan lessThan )?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 19, 2012, 17:23 »

Читаю документацию, однако))) а там

An alternative to using qSort() is to put the items to sort in a QMap, using the sort key as the QMap key. This is often more convenient than defining a lessThan function.

Я так понимаю, что нефиг извращаться и воспользоваться

void qSort ( RandomAccessIterator begin, RandomAccessIterator end, LessThan lessThan )?
С QMap возможно на пару строк короче, но грамотнее конечно qSort
Записан
Bepec
Гость
« Ответ #6 : Июнь 19, 2012, 18:48 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 19, 2012, 18:53 »

Кхм... Почему то всегда думал и думаю, что QMap автоматом сортирует по ключу данные при добавлении. А тут вот оно как. Неужели работает?
Ну да, сортирует при добавлении. Только для каждого добавленного надо выделить память, да вставить, да в конце еще вылить в результат. А сортировка - просто обмен, поэтому расход памяти 0 и с нормальным функтором - намного быстрее
Записан
Alex_C
Гость
« Ответ #8 : Июнь 19, 2012, 22:14 »

Пытаюсь реализовать через qSort
Код
C#
 stuct PrefixRecord
{
 QString s1;
 QString s2;
}
............................
   bool prefLessThan(const PrefixRecord &p1, const PrefixRecord &p2)
   {
       return p1.s1< p2.s1;
   }
.............................
QVector<PrefixRecord> *s = new QVector<PrefixRecord>;
s->resize(1000);
   qSort(s->begin(), s->end(), prefLessThan);
 

Вызов qSort вызывает ошибку. Не найден нужный шаблон для qSort. Вроде уже и доку перечитал много раз - в Дельфи аналогичное много раз делал, а тут не пойму, что не так?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #9 : Июнь 19, 2012, 22:38 »

а у тебя prefLessThan статическая или глобальная функция?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Июнь 19, 2012, 23:00 »

Вызов qSort вызывает ошибку. Не найден нужный шаблон для qSort. Вроде уже и доку перечитал много раз - в Дельфи аналогичное много раз делал, а тут не пойму, что не так?
Только что проверил и никакой ошибки:
Код
C++ (Qt)
struct PrefixRecord
{
 QString s1;
 QString s2;
};
 
bool prefLessThan(const PrefixRecord &p1, const PrefixRecord &p2)
{
   return p1.s1< p2.s1;
}
 
void Widget::on_pushButton_clicked()
{
   QVector<PrefixRecord> *s = new QVector<PrefixRecord>;
   s->resize(1000);
   qSort(s->begin(), s->end(), prefLessThan);
}
Разница с вашим кодом только в том, что всё подряд идёт и вместо stuct я написал всё же struct.
Записан
Alex_C
Гость
« Ответ #11 : Июнь 20, 2012, 10:34 »

Разница с вашим кодом только в том, что всё подряд идёт и вместо stuct я написал всё же struct.

Спасибо большое!
Уже дома и сам понял в чем ошибка - prefLessThan определил в классе, а надо как отдельная ф-ция!
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #12 : Июнь 20, 2012, 11:03 »

Разница с вашим кодом только в том, что всё подряд идёт и вместо stuct я написал всё же struct.

Спасибо большое!
Уже дома и сам понял в чем ошибка - prefLessThan определил в классе, а надо как отдельная ф-ция!

можно как статическую функцию в классе.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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