Как использовать comparador, чтобы упорядочивать список внутри класса?

class Coloreo {
    vector<int> assigned_color;

    bool compare (int a, int b) {
        return assigned_color[a] < assigned_color[b];
    }

public:

    vector<int> coloreo_secuencial (Grafo & g) {
        int n = g.size();
        assigned_color.resize(n, -1);
        assigned_color[0] = 0;
        for (int u = 1; u < n; u++) {
            int c = 0;
            list<int> edges = g.getVerticesAdyacentes(u);
            edges.sort(compare);
            for (int v : edges) {
                if (assigned_color[v] == c) {
                    c++;
                }
            }
            assigned_color[u] = c;
        }
        return assigned_color;
    }
};

Я хочу использовать comparador compare чтобы упорядочивать список edges: edges.sort(compare); но он бросает в меня следующую ошибку: error: must use '.*' or '->*' to call pointer-to-member function in '__comp (...)', e.g. '(... ->* __comp) (...)'|

Любопытное - что, если я делаю все снаружи классом, если он позволяет мне делать это. С этим я отношусь, в который vector<int> assigned_color; я это размещаю как глобально и остальные функции в main и пройди все добро, но когда я хочу поместить это в класс, он не оставляет меня.

3
задан 11.03.2019, 07:43
1 ответ

В твоем случае compare это - один funciГіn член Coloreo, а именно, для того, чтобы этот вызов функционировал habrГ, - которому писать что-то сходное в:

edges.sort(compare(this));

Но просвет, он не будет составлять это в жизни.

OpciГіn 1

Возможная альтернатива состоит в том, чтобы конвертировать ее funciГіn в estГЎtica. Проблема, что ты находишься aquГ - он состоит в том, что она funciГіn compare использует assigned_color, которые это - изменчивая член Coloreo... эта переменная tambiГ©n deberГ, - чтобы быть estГЎtica:

class Coloreo {
    static vector<int> assigned_color;

    static bool compare (int a, int b) {

Из этой формы уже sГ - deberГ, - чтобы тебя функционировать, так как сейчас compare, как весь funciГіn estГЎtica, не precisarГЎ инстанции Coloreo.

Итак, в зависимости от оставшейся части cГіdigo, который ты не поместил в вопрос, возможно, что opciГіn, не было применимым к твоему случаю... в этом случае мы нуждаемся в адаптере, чтобы мочь призывать к this->compare внутри нее funciГіn sort. Если C ++ 11 - один opciГіn, мы можем использовать одну funciГіn lambda:

edges.sort([this](int a, int b){ return this->compare(a,b); });

то, что он делает этим lambda, состоит в том, чтобы оставлять себе this, указатель, который указывает на инстанцию Coloreo, и использовать это, чтобы мочь звонить в нее funciГіn член compare.

OpciГіn 2

Si lambdas не одни opciГіn он у тебя остается она opciГіn использования класса:

struct Coloreo {
    struct Adaptador
    {
      Coloreo & instancia;

      Adaptador(Coloreo & instancia)
        : instancia(instancia)
      { }

      bool operator()(int a, int b)
      { return instancia.compare(a, b); }
    };

// ...
edges.sort(Adaptador(*this));

В этом случае адаптер осуществляет оператор funciГіn. Ваш lГіgica он эквивалентный тому lambda.

3
ответ дан 19.11.2019, 22:20
  • 1
    Adaptador(Coloreo & instancia) : instancia(instancia) { } я не понимаю это решение. – Guido Modarelli 11.03.2019, 12:14
  • 2
    @GuidoModarelli - строитель адаптера. Служат для того, чтобы инициализировать две точки члены класса. В этом случае мы делаем, что изменчивая член, который является ссылкой, заметка в объект, который проходит с ним как аргумент – eferion 11.03.2019, 12:19
  • 3
    То, что он перемещает, состоит в том, что аргумент и изменчивая член они называются равными..., если инициализация не была сделана в двух точках habrí в который использовать this, чтобы удалять ambigü возраст. Это sí ссылки не могут инициализироваться другой формы – eferion 11.03.2019, 12:21