Как отсортировать список std: когда вам нужны данные участника? - PullRequest
1 голос
/ 27 ноября 2011

Так что я бы знал, как его отсортировать, если бы я мог использовать вектор, но мы должны реализовать его с помощью списка.Наш профессор сказал, что мы можем использовать функцию сортировки, уже реализованную в классе списка.Если бы это был вектор, я мог бы создать структуру, а затем использовать сортировку из <алгоритма>, чтобы пройти через мой список, но это не позволило бы мне использовать это, так как std :: list не имеет произвольного доступа.API говорит "template ", но я не думаю, что это поможет мне.

Я понимаю, что могу использовать функцию сортировки, но мне нужно использовать данные членов для ее сортировки.Я сортирую точки по их полярному углу, и мне нужно использовать текущую точку, которая является членом моего класса, в качестве «источника», поэтому я не могу использовать статический сортировочный компаратор, как обычно.

РЕДАКТИРОВАТЬ Я использую это как мой сортировочный вызов: sortedList.sort(sorting);

и вот моя функция:

bool sorting(const Point& p, const Point& q) {
    Point z = pointStack.top();
    Point u = Point(p.getX() - z.getX(), p.getY() - z.getY());
    Point v = Point(q.getX() - z.getX(), q.getY() - z.getY());
    double r = u.polarAngle();
    double s = v.polarAngle();
    if (r < s) {
            return true;
    } else { 
            return false;
    }
}

Я продолжаю получать

c: \пользователи \ wooly \ Documents \ visual studio 2010 \ projects \ proj5 \ proj5 \ grahamscan.cpp (20): ошибка C3867: 'GrahamScan :: sorting': отсутствует список аргументов при вызове функции;используйте '& GrahamScan :: sorting', чтобы создать указатель на член

, так как для сортировки мне нужно верхнее значение pointStack, но оно является членом моего класса.

Ответы [ 2 ]

5 голосов
/ 27 ноября 2011

Вы можете просто вызвать функцию сортировки напрямую, если ваш тип значения имеет оператор <определено. </p>

std::list<int> myList;
// Do stuff to the list
myList.sort();

Или, если это не так, вам нужно предоставить функтор, который будет выполнять сравнение.

struct MyClassComparator {
    bool operator()(const MyClass& first, const MyClass& second) const {
        // Return true if first should go before second
        return true;
    }
};

std::list<MyClass> myList;
// Do stuff to the list
myList.sort(MyClassComparator());
1 голос
/ 27 ноября 2011

Вы можете просто вызвать функцию-член sort, если типы, которые вы храните, уже можно сравнить с <:

list<int> l;
l.push_back(3);
l.push_back(2);
l.push_back(1);

l.sort();

print_list(l);

И если print_list напечатает список, он напечатает 1 2 3.

Вам нужно только передать sort аргумент, если тип, который вы храните в списке, не определен operator<. Вы можете сделать это так:

class Compare_MyClass {
public:
    bool operator()(const MyClass& lhs, const MyClass& rhs) {
        return lhs.member < rhs.member; // or some comparison
    }
};

list<MyClass> l;
l.push_back(MyClass(...));
l.push_back(MyClass(...));
l.push_back(MyClass(...));

l.sort(Compare_MyClass());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...