Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: SparrowGОтветов: 1

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

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

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

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

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

c++operator-overloadingstlstl-algorithm

Ответы

Ответ 1 · рейтинг 6 · Mike Seymour

Вы бы использовали компаратор, который хранит ссылку на дополнительное состояние, которое ему нужно, вместо 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));
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы