在类中对结构的c ++向量进行排序

时间:2012-11-20 01:30:11

标签: c++ class sorting vector struct

我有一个基本上看起来像这样的类(我删除了不必要的代码):

class WilxList {
private:    
    struct Test{
        double number;
        int sign;
        int rank;
    };
    bool testSorter(const Test & x1, const Test & x2);
public: 
    WilxList(std::vector<double> &argNumbers, std::string argName, int numberOfTests);
};

我正在尝试对这样的测试结构进行排序:

WilxList::WilxList(std::vector<double> &argNumbers, std::string argName, int numberOfTests)
{
    //Omitted code
    std::vector<Test> sortedTests;
    //Omitted code where Tests are created and added to the vector inside for loop
    std::sort(sortedTests.begin(), sortedTests.end(), testSorter); //ERROR

}

我得到的错误是:

error C3867: 'WilxList::testSorter': function call missing argument list; 
use '&WilxList::testSorter' to create a pointer to member
c:\users\stenver\documents\visual studio 2012\projects\wilxoniastakutest\wilxoniastakutest\wilxlist.cpp 

4 个答案:

答案 0 :(得分:5)

testSorter是类WilxList非静态成员函数,这会导致难度。使用非静态成员函数的函数指针相对更难,并且在期望像sort算法这样的自由(或静态成员)函数的情况下不可能使用。

解决此问题的一个选项是将testSorter移动到结构本身并将其重命名为operator<。这可以让你做x1<x2这样的事情,你可以调用sort只是std::sort(sortedTests.begin(), sortedTests.end());这假设函数实际上代表一个<操作,如果它不是,它可能会让人感到困惑,并且会更简洁,只需使其成为静态成员函数。在任何一种情况下,错误都会消失。

答案 1 :(得分:1)

问题是比较器函数是一个成员函数,std::sort不期望。

你可以通过多种方式解决这个问题:第一种是使比较器函数static,另一种是使它成为一个独立的函数,第三种方法是使用C ++ 11 lambda表达

答案 2 :(得分:1)

将代码更改为:

class WilxList {
private:    
    static bool testSorter(const Test & x1, const Test & x2);
}

std::sort(sortedTests.begin(), sortedTests.end(), WilxList ::testSorter); //ERROR

非静态testSorter采用隐式this指针,该指针在std::sort中用作谓词时不兼容,它带有两个参数。

此外,您可以将testSorter声明为全局函数,也可以。

答案 3 :(得分:0)

你想要

 std::sort(sortedTests.begin(), sortedTests.end(), std::mem_fun(&WilxList ::testSorter));

或类似的东西。点击http://www.cplusplus.com/reference/std/functional/mem_fun/