如何在需要成员数据时对std:list进行排序?

时间:2011-11-26 22:37:48

标签: c++ list sorting

所以如果我可以使用向量,我会知道如何对它进行排序,但我们需要使用列表来实现它。我们的教授说我们可以使用已在列表类中实现的sort函数。如果它是一个向量,我可以创建一个结构,然后使用sort from<算法>通过我的列表,但它不会让我使用它,因为std :: list没有随机访问。 API说“模板<类比较>”但我认为这不会对我有所帮助。

据我所知,我可以使用sort函数,但我需要使用成员数据对其进行排序。我按极角对点进行排序,我需要使用当前Point作为我的类的成员作为“原点”,所以我不能像往常一样使用静态排序比较器。

EDIT 我正在使用它作为我的排序调用: 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:\ users \ wooly \ documents \ visual studio 2010 \ projects \ proj5 \ proj5 \ grahamscan.cpp(20):错误C3867:'GrahamScan :: sorting':函数调用缺少参数列表;使用'&amp; GrahamScan :: sorting'创建指向成员的指针

因为我需要pointStack的最高值来进行排序,但它是我班级的成员。

2 个答案:

答案 0 :(得分:5)

如果您的值类型具有运算符&lt;

您可以直接调用sort函数。定义

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 :(得分:1)

如果您要存储的类型可以与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());