Пользовательский компаратор, использующий нестатические поля - PullRequest
0 голосов
/ 10 октября 2019

Предположим, у меня есть обертка вокруг set<int> с пользовательской функцией сравнения, как показано ниже:

#include <set>
#include <map>
using namespace std;

class my_pq {
private:
    map<int,int> weight_of;
    struct comp {
        bool operator() ( const int x, const int y ) {
            return weight_of[x] < weight_of[y];
        }
    };
    set<int,my_pq::comp> pq;
public:
    void insert_with_weight( int x, int w ) {
        weight_of[x]= w, pq.insert(x);
    }
};

Как в этом случае можно инициализировать переменную pq, то есть использовать пользовательскую comp х operator() в качестве компаратора? То есть значения, вставленные в pq, должны сравниваться в соответствии с comp. Возможно ли это в принципе, или нужно вместо этого явно пропустить пару (weight,element), и обходного пути нет?

РЕДАКТИРОВАТЬ: я изменил свой код, как было предложено в комментариях, но я получаюследующие сообщения об ошибках:

In file included from /usr/include/c++/8/set:60,
                 from mwe.cpp:1:
/usr/include/c++/8/bits/stl_tree.h: In instantiation of ‘class std::_Rb_tree<int, int, std::_Identity<int>, my_pq::comp, std::allocator<int> >’:
/usr/include/c++/8/bits/stl_set.h:133:17:   required from ‘class std::set<int, my_pq::comp>’
mwe.cpp:13:26:   required from here
/usr/include/c++/8/bits/stl_tree.h:457:21: error: static assertion failed: comparison object must be invocable as const
       static_assert(is_invocable_v<const _Compare&, const _Key&, const _Key&>,
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mwe.cpp: In member function ‘bool my_pq::comp::operator()(int, int)’:
mwe.cpp:10:20: error: invalid use of non-static data member ‘my_pq::weight_of’
             return weight_of[x] < weight_of[y];
                    ^~~~~~~~~
mwe.cpp:7:18: note: declared here
     map<int,int> weight_of;
                  ^~~~~~~~~
mwe.cpp:10:35: error: invalid use of non-static data member ‘my_pq::weight_of’
             return weight_of[x] < weight_of[y];
                                   ^~~~~~~~~
mwe.cpp:7:18: note: declared here
     map<int,int> weight_of;
                  ^~~~~~~~~

Я предполагаю, что структура должна иметь ссылку на вмещающий объект, но вмещающий объект должен каким-то образом инициализировать pq, поэтому существует замкнутый круг.

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