Реклама

Qt/C++ - Урок 062. Компаратор для сортировки QList

РуководствоQtQList, sort, сортировка945

При работе с простыми типами можно использовать стандартные средства сортировки. Если же требуется производить сортировку сложных объектов, по множеству параметров, то требуется написать специальный компаратор, который будет производить сравнение по требуемым параметрам.

Напишем небольшой компаратор, который будет сортировать объекты класса QPointF . Правила сортировки будут простые. В первую очередь сортировка должна производиться по координате X, а если координаты X совпадают, то производим сортировку по координате Y.

То есть, до сортировки список может выглядеть так:

(QPointF(12.4,15.4), QPointF(14.1,7.5), QPointF(7.2,5.2), QPointF(4.2,18.5), QPointF(4.2,1.2), QPointF(-19.5,12.4), QPointF(1.1,1.2))

После сортировки список будет выглядеть так:

(QPointF(-19.5,12.4), QPointF(1.1,1.2), QPointF(4.2,1.2), QPointF(4.2,18.5), QPointF(7.2,5.2), QPointF(12.4,15.4), QPointF(14.1,7.5))

Компаратор

Напишем компаратор в качестве статической функции:

// компаратор должен быть статической функцией, 
// иначе её нельзя будет передать её в качестве аргумента
static bool compare(const QPointF& first, const QPointF& second)
{
    if (first.x() < second.x())
    {
        return true;
    }
    else if (first.x() > second.x())
    {
        return false;
    }
    else
    {
        if (first.y() < second.y())
        {
            return true;
        }
        else
        {
            return false;
        }
    }

}

Использование компаратора

// Создадим и заполним список
QList<QPointF> pointsList;
pointsList << QPointF(12.4, 15.4)
           << QPointF(14.1, 7.5)
           << QPointF(7.2, 5.2)
           << QPointF(4.2, 18.5)
           << QPointF(4.2, 1.2)
           << QPointF(-19.5, 12.4)
           << QPointF(1.1, 1.2);

// Проверим состав списка
qDebug() << pointsList;

// Отсортируем
std::sort(pointsList.begin(), pointsList.end(), compare);

// Проверим результат
qDebug() << pointsList;

Результат будет аналогичен тому, что был приведён в начале.

Реклама

Комментарии

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
Последние комментарии
  • EVILEG
  • 23 мая 2017 г. 12:26

Qt/C++ - Урок 005. QSqlRelationalTableModel - Работаем со связными таблицами

В классе DataBase указывается путь к базе данных. В данном случае C:/example/ и т.д. Так вот, у вас есть каталог example ?

  • EVILEG
  • 23 мая 2017 г. 12:19

Qt/C++ - Урок 029. Изображение в базе данных в Qt – Сохранение и Восстановление

Нет. не верно. Ошибка вот в этой строке: QPixmap inixmap = fileName; // Сохраняем его в изображение объекта QPixmap; Выше я показывал, как что нужно путь передавать в качестве аргумент...

Qt/C++ - Урок 029. Изображение в базе данных в Qt – Сохранение и Восстановление

QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "/home", tr("Images (*.png *.xpm *.jpg)")); QPixmap inixmap = fileName; // Сохраняем его в и...

Qt/C++ - Урок 005. QSqlRelationalTableModel - Работаем со связными таблицами

https://www.dropbox.com/sh/vhxcx0iyq0j4578/AACwgWPnZwNqGBndKESiXfFqa?dl=0

  • tetta
  • 22 мая 2017 г. 1:32

Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP

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

Сейчас обсуждают на форуме
  • tetta
  • 23 мая 2017 г. 17:59

Создание кнопки "new", "save" и "open". MDI. toolBar

void MainWindow::open(){ QString openFile = QFileDialog::getOpenFileName(this, tr("Open File"), "C:/", ...

Проверка наличия записи в БД при выполнении запроса

Код форм про которые говорил прикрепил. regrdit форма в которой отображается информация отбираемая из базы. editobject форма для редактирования

  • Arrow
  • 23 мая 2017 г. 13:41

qmake

Странно по сообщениям выдает, что у меня компилирутся 32 bit версия (x86 build). Компилятор опознан правильно и в ABI сам определилил x86-windows-msys-pre-64bit и исполняемый файл создае...

WinApi CBTProc

Да всех активных, тоесть через CBT.