Предположим, у меня есть обертка вокруг 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
, поэтому существует замкнутый круг.