Куда идет перегрузка оператора при доступе к данным из структуры?

У меня есть функция в структуре, которая сортирует вектор в структуре. Но чтобы сравнить два элемента в векторе, мне нужно значение другой переменной внутри той же структуры. Мне было интересно, где я должен хранить перегрузку оператора или функцию сравнения, чтобы этот вид работал. Я дал образец в следующей пасте.

#include<vector>
#include<algorithm>

struct Square{
    int color; //value 1 to 10
};
struct State{
    vector<Square> list;
    int color_weight[] = {4,3,5,2,4,1,6,4,5,9}; //These values keep changing.
    bool operator<(Square& a, Square& b);
    void sortTheList();

};    

bool State::operator<(Square& a, Square& b){
    if (color_weight[a.color]< color_weight[b.color]){
        return true;
    }
    return false;
}

void Square::sortTheList(){
    sort(list.begin(),list.end());
}

Это не работает, конечно. Я пробовал много других сигнатур и возможностей для функции сравнения, но ничего не работает.

Есть идеи, что здесь можно сделать?


person SparrowG    schedule 16.12.2011    source источник
comment
Это опечатка, что вы забыли bool в качестве возвращаемого типа в объявлении operator<?   -  person Tamer Shlash    schedule 16.12.2011
comment
Ваш настоящий Square сложнее? Если нет, то почему вы заключаете его в структуру?   -  person Kate Gregory    schedule 16.12.2011
comment
@Mr.TAMER да, это была опечатка   -  person SparrowG    schedule 16.12.2011
comment
@KateGregory Да, мой настоящий Квадрат сложнее.   -  person SparrowG    schedule 16.12.2011
comment
Нет необходимости в операторе if и двух return внутри State::operator<, тело можно упростить до return color_weight[a.color] < color_weight[b.color];   -  person fredoverflow    schedule 16.12.2011


Ответы (1)


Вы бы использовали компаратор, который хранит ссылку на дополнительное состояние, которое ему нужно, вместо operator<. Что-то вроде этого:

struct CompareWeight {
    CompareWeight(int const * weight) : weight(weight) {}
    bool operator()(Square const & lhs, Square const & rhs) {
        return weight[lhs.color] < weight[rhs.color];
    }
    int const * weight;
};

void Square::sortTheList() {
    std::sort(list.begin(), list.end(), CompareWeight(color_weight));
}
person Mike Seymour    schedule 16.12.2011
comment
На самом деле, он может использовать состояние в качестве компаратора. Хотя это правильная концепция - person Mooing Duck; 16.12.2011
comment
@MooingDuck: вы имеете в виду добавить странный operator() в State и передать его копию (включая вектор, который может быть довольно большим) в sort(), чтобы не определять маленький класс? Это кажется довольно странным. - person Mike Seymour; 16.12.2011
comment
@SparrowG: Да, просто замените int const * на std::vector<int> const &, и все должно работать. Или оставить как есть и создать с помощью CompareWeight(&color_weight[0]). - person Mike Seymour; 16.12.2011
comment
@mike: забыл копию. Можно ли передать предикат по ссылке? Если нет, то это путь. - person Mooing Duck; 16.12.2011