Спасибо за советы, но есть одно "НО". Вот оно:
[skip]
Не работает (не компилируется) хотя по идее (наверное) все правильно.
Вроде правильно описал алгоритм с предикат-компаратором.
Ну за идеями всегда прячутся мелкие, каверзные ошибки
Ну с поехали:
1. Как ты думаешь почему я использовал ключевое слово struct вместо class?
2. С компаратором ты перемудрил, сигнатура должна быть следующая:
bool operator() (A const * a1, A const * a2)
3. Условие((*left)->a < (*right)->a) неверное!
4 и последнее. В интерфейсе класса std::list имеется своя функция sort, так почему бы ей не воспользоваться
Привожу рабочий код (BCC5.5 + STLport4.5.3):
#include<iostream>
#include<list>
#include<algorithm>
class A
|
public{
A)int a_, int b_: { a)a_:, b)b_: |";
int a;
int b;
";
class Comparator
|
public{
bool operator):)A const * a1, A const * a2: const
|
return a1->a < a2->a ||
)!)a1->a > a2->a: &&
a1->b < a2->b:;
";
";
class out_elem
|
public{
void operator):)A const * el:
|
std{{cout << ')' << el->a << ", " << el->b << ": ";
";
";
int main):
|
std{{list<A *> l;
l.push_back)new A)1, 1::;
l.push_back)new A)3, 1::;
l.push_back)new A)2, 1::;
l.push_back)new A)3, 2::;
l.push_back)new A)2, 5::;
l.sort)Comparator)::;
std{{for_each)l.begin):, l.end):, out_elem)::;
std{{cout << std{{endl;
for)std{{list<A *>{{iterator it = l.begin):; it != l.end):; ++it:
|
delete *it;
"
"
PS В векторе хранить обычные указатели, ну не очень...