C++ 当您需要成员数据时,如何对std:list进行排序?

C++ 当您需要成员数据时,如何对std:list进行排序?,c++,list,sorting,C++,List,Sorting,所以如果我可以使用向量,我会知道如何排序,但我们需要使用列表来实现它。我们的教授说我们可以使用list类中已经实现的排序函数。如果它是一个向量,我可以创建一个结构,然后使用sort from遍历我的列表,但它不允许我使用它,因为std::list没有随机访问。API说模板,但我认为这对我没有帮助 我知道我可以使用sort函数,但我需要使用成员数据对其进行排序。我根据极角对点进行排序,我需要使用类中的当前点作为原点,所以我不能像通常那样使用静态排序比较器 编辑 我将此用作我的分类呼叫: 分类列表。

所以如果我可以使用向量,我会知道如何排序,但我们需要使用列表来实现它。我们的教授说我们可以使用list类中已经实现的排序函数。如果它是一个向量,我可以创建一个结构,然后使用sort from遍历我的列表,但它不允许我使用它,因为std::list没有随机访问。API说模板,但我认为这对我没有帮助

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

编辑 我将此用作我的分类呼叫: 分类列表。分类排序

这是我的功能:

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.cpp20:错误C3867:'grahamscan::sorting':函数调用缺少参数列表;使用“&GrahamScan::sorting”创建指向成员的指针


因为我需要pointStack的顶级值来进行排序,但它是我的类的一个成员。

如果要存储的类型可以与进行比较,则只需调用sort member函数。如果要存储的类型可以与进行比较,则只需调用sort member函数类型已定义运算符<

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());

如果值类型已定义运算符<,则可以直接调用排序函数

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());

所以我对structs有点陌生。我会把它作为我当前类的一个子类,这样它就可以访问当前点,然后让重载的take包含两个点吗?@woolcock66不,它不需要是任何东西的子类。它被称为函子。通常将其作为自己的结构。请记住C++类和结构之间唯一的区别是默认结构中的所有内容都是公共的。但是,如果comparator类与用户定义的类型分开,则只能使用公共成员和方法进行比较,除非将comparator声明为类的朋友。如果这让人困惑,那么你可以在你的类中定义一个操作符<,并让sort的无参数版本来完成这项工作。好的,我编辑了我的原始文章,现在尝试对它进行排序。你的列表中有什么?使用当前函数只能对点对象的容器进行排序,而pointStack必须是全局可用的,这样函数才能访问它。我会把它作为我当前类的一个子类,这样它就可以访问当前点,然后让重载的take包含两个点吗?@woolcock66不,它不需要是任何东西的子类。它被称为函子。通常将其作为自己的结构。请记住C++类和结构之间唯一的区别是默认结构中的所有内容都是公共的。但是,如果comparator类与用户定义的类型分开,则只能使用公共成员和方法进行比较,除非将comparator声明为类的朋友。如果这让人困惑,那么你可以在你的类中定义一个操作符<,并让sort的无参数版本来完成这项工作。好的,我编辑了我的原始文章,现在尝试对它进行排序。你的列表中有什么?使用当前函数只能对点对象的容器进行排序,而pointStack必须全局可用,以便函数可以访问它。