Куда идет перегрузка оператора при доступе к данным из структуры? - PullRequest
3 голосов
/ 16 декабря 2011

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

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

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

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

1 Ответ

6 голосов
/ 16 декабря 2011

Вместо 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));
}
...