需要帮助STL排序算法

时间:2009-07-09 15:24:18

标签: c++ algorithm stl sorting

我在使用std :: sort算法时遇到了一些麻烦。我正在阅读你可以重载小于运算符来对类进行排序,但我遇到了各种各样的错误。我也尝试过使用仿函数,正如我在下面的例子中看到的那样。

我希望有人能看到我在这里做错了什么。

#include <iostream>
#include <vector>
#include <algorithm>

#include <stdlib.h>
#include <time.h>

class Thing {
public:
    Thing(int val) {
        this->_val = val;
    }

    bool operator<(Thing& rhs) {
        std::cout << "this works!";
        return this->val() < rhs.val();
    }

    int val() {
        return this->_val;
    }
protected:
    int _val;
};

struct Sort {
    bool operator()(Thing& start, Thing& end) {
        return start.val() < end.val();
    }
};

int main (int argc, char * const argv[]) {
    std::srand(std::time(NULL));

    std::vector<Thing> things;
    for(int i = 0; i < 100; i++) {
        Thing myThing(std::rand());
        things.push_back(myThing);
    }

    if(things[1] < things[2]) {
        //This works
    }

    //std::sort(things.begin(), things.end()); //This doesn't

    //std::sort(things.begin(), things.end(), Sort()); //Neither does this

    for(int i = 0; i < 100; i++) {
        std::cout << things.at(i).val() << std::endl;
    }

    return 0;
}

3 个答案:

答案 0 :(得分:4)

制定val()operator<() const个功能。

Sort::operator()也是如此 - 取const Thing&代替Thing&

答案 1 :(得分:3)

我相信你需要改变

bool operator()(Thing& start, Thing& end) {

bool operator()(const Thing& start, const Thing& end) {

int val() {

int val() const {

IOW,你的代码需要是const-correct而不是声称它可能会修改它实际上没有(也不需要)的东西。

答案 2 :(得分:0)

尝试制作运营商&lt;通过const引用来获取它的参数。当你这样做时,你需要改变它的实现来直接访问_val或(最好)make val()const(因为const成员函数不能调用非const成员函数)。