Нужна помощь с алгоритмом сортировки STL - PullRequest
1 голос
/ 09 июля 2009

У меня проблемы с использованием алгоритма std :: sort здесь. Я читал, что вы можете просто перегрузить оператор less, чтобы сортировать классы, но я получаю всевозможные ошибки. Я также попытался использовать функтор, как вы можете видеть в приведенном ниже примере.

Я надеялся, что кто-нибудь увидит, что я здесь делаю неправильно.

#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 ]

4 голосов
/ 09 июля 2009

Сделайте ваши функции val() и operator<() const.

То же самое для Sort::operator() - возьмите const Thing& вместо Thing&.

3 голосов
/ 09 июля 2009

Я считаю, что вам нужно изменить

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

в

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

и

int val() {

в

int val() const {

Итак, ваш код должен быть константно-корректным и не утверждать, что он может изменять то, чего он на самом деле не делает (и не нуждается).

0 голосов
/ 09 июля 2009

Попробуйте заставить оператор <получить его аргумент по константной ссылке Вам нужно будет изменить его реализацию для прямого доступа к _val или (предпочтительно) make val () также, когда вы делаете это (потому что функция-член const не может вызывать неконстантную). </p>

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