аня Гость
|
Добавлено: Сб Июн 26 2004 17:47 Заголовок сообщения: C++ Bulder, класс TList: метод List->Sort. Очень срочно. |
|
|
Есть структура
Цитата: |
struct info
{
int v1;
int v2;
}
|
Заполняем список класса TList:
Цитата: |
first->Add(new info(1, 2));
first->Add(new info(3, 4));
first->Add(new info(4, 6));
first->Add(new info(5, 7));
first->Add(new info(2, 2));
first->Add(new info(4, 7));
first->Add(new info(5, 6));
first->Add(new info(6, 10));
|
Нужен отсортированный список по возрастанию. Причем только по первому элементу в структурной записи списка (info->v1).
Для этого использую метод List->Sort и функцию "_compare2":
Цитата: |
int __fastcall _compare2(void* o1, void* o2)
{
return
((info *)o1)->v1 > ((info *)o2)->v1 ?
1 : ((info *)o1)->v1 < ((info *)o2)->v1 ?
-1 : 0;
}
|
Далее пишу: "first->Sort(_compare2);"
Список сортируется по возрастанию , но с небольшим недочетом.
Как сделать так, чтобы, если записи по первому элементу повторяются (т.е по info->v1), то в отсортированном списке первым шел тот элемент, который первым встретился в изначальном списке.
Т.е. в итоге должен получится список:
(1,2)(2,2)(3,4)(4,6)(4,7)(5,7)(5,6)(6,10). |
|
wildwind
Зарегистрирован: 03.02.2004 Сообщения: 268 Откуда: Москва
|
Добавлено: Вс Июн 27 2004 16:42 Заголовок сообщения: |
|
|
Как видишь, в функции сравнения нельзя получить информацию о положении элемента в списке. Это не согласуется с самой концепцией сравнения: отношения между элементами "больше" или "меньше" не зависят от их местонахождения.
Твою проблему можно решить так.
1. Добавь в структуру еще одно поле, скажем "v3".
2. При добавлении элементов в список заполняй его последовательными значениями 1, 2, 3, ...
3. Сортировку делай по ключу v1+v3.
BTW давать объектам в программе неосмысленные имена (типа v1, v2, v3) -- это плохой стиль. |
|