Пример:
У нас есть массив
arr
, состоящий из структур Rec
. Нужно получить отсортированную последовательность данных, не изменяя исходный массив. Мы создаем новый массив
ptrarr
с указателями на исходные структуры и используем std::sort
для его сортировки. Для того, чтобы указатели были отсортированы в порядке возрастания данных, нам нужно определить функцию сравнения указателей (lessFunc
) и передать ее в std::sort
.
- #include <algorithm>
- #include <iostream>
- using namespace std;
- //////////////////////////////////////////////////////
- struct Rec
- {
- Rec () : _a(0), _b(0)
- {
- }
- Rec (int a, int b) : _a(a), _b(b)
- {
- }
- Rec (const Rec &r)
- {
- _a = r._a;
- _b = r._b;
- }
- bool operator< (const Rec &r)
- {
- if (_a < r._a)
- {
- return true;
- }
- else if (_a == r._a && _b < r._b)
- {
- return true;
- }
- return false;
- }
- int _a;
- int _b;
- };
- typedef Rec * RecPtr;
- //////////////////////////////////////////////////////
- void printRec (const RecPtr &r)
- {
- cout << (*r)._a << " - " << (*r)._b << endl;
- }
- //////////////////////////////////////////////////////
- bool lessFunc (const RecPtr &l, const RecPtr &r)
- {
- return ((*l) < (*r));
- }
- //////////////////////////////////////////////////////
- int main (int, char **)
- {
- // Array size
- const size_t len = 5;
- // Data array
- Rec *arr = new Rec[len];
- arr[0] = Rec(5, 5);
- arr[1] = Rec(1, 1);
- arr[2] = Rec(3, 0);
- arr[3] = Rec(1, 2);
- arr[4] = Rec(5, 1);
- // Pointer array
- RecPtr *ptrarr = new RecPtr[len];
- for (size_t i = 0; i < len; ++i)
- {
- ptrarr[i] = arr + i;
- }
- cout << "--- before" << endl;
- for_each(ptrarr, ptrarr + len, printRec);
- sort(ptrarr, ptrarr + len, lessFunc);
- cout << "--- after" << endl;
- for_each(ptrarr, ptrarr + len, printRec);
- delete [] ptrarr;
- delete [] arr;
- return 0;
- }
- //////////////////////////////////////////////////////
Комментариев нет:
Отправить комментарий