Позвольте мне представить мой класс:станд :: priority_queue, содержащий мой собственный класс
#include <tuple>
#include <queue>
#include <initializer_list>
template <typename HType>
class Huffman {
class TreeOfLetters {
HType Value;
char Letter;
TreeOfLetters *Root = nullptr;
TreeOfLetters *Left = nullptr;
TreeOfLetters *Right = nullptr;
TreeOfLetters(HType _Value, char _Letter) : Value(_Value), Letter(_Letter) {
};
};
auto compare = [](const TreeOfLetters &a,const TreeOfLetters &b){
return a.Value < b.Value;};
std::priority_queue(TreeOfLetters, std::set<TreeOfLetters>, compare);
public:
Huffman(std::initializer_list<HType> _Values, std::initializer_list<char> _Chars);
Huffman(const Huffman& orig) = delete;
};
То, что я хочу добиться того, чтобы хранить указатели на деревья в станд :: priority_queue таким образом, что на вершине будет тот, который является наивысшим.
Я знаю, что я могу получить контейнер, который мне нравится, а затем отсортировать его, но я хочу использовать std :: priority_queue, который сделает это автоматически.
Поскольку я не очень хорошо знаком с функциями C++ 11, я получаю некоторые ошибки, и я был бы очень признателен за вашу помощь в избавлении от них.
Прежде всего, я не уверен, что моя лямбда правильная, поэтому я хочу, чтобы некоторые эксперты подтвердили правильность моего подхода или нет.
предупреждения, которые я ПОЛУЧУ:
Unable to resolve identifier TreeOfLetters.
Unable to resolve identifier compare.
Unable to resolve identifier Value.
EDIT: Большое спасибо Петра и Thoran за их помощь я сделал перегрузить оператор < поэтому я добавить эти строки в мой класс
bool operator<(const TreeOfLetters &a,const TreeOfLetters &b)
{
return a.Value < b.Value;
}
Я все еще получаю сообщение об ошибке из следующей строки. Я буду очень признателен за то, что поможет мне решить эту проблему.
std::priority_queue <TreeOfLetters, std::vector<TreeOfLetters>, Compare> queue;
In file included from Huffman.cpp:1:0: Huffman.h:37:77: error: invalid declarator before ‘queue’
Ваше определение очереди выглядит неправильно? Вы пытаетесь использовать шаблоны 'set :: priority_queue? Кроме того, lamba странно, создайте структуру, перегружая оператор() в качестве входного значения сравнения. –
thorsan
Да, это так, мое определение очереди должно выглядеть как std :: priority_queue (TreeOfLetters, std: set ? Я не понимаю, что третье предложение в вашем комментарии могло бы показать мне путь? –
FieryCod
Вы не можете использовать 'std :: set' в качестве контейнера для' std :: priority_queue'. Чтобы использовать lambda, вы можете использовать 'std :: priority_queue, std :: function < bool (const TreeOfLetters &, const TreeOfLetters &) >> pq {[] (const TreeOfLetters & a, const TreeOfLetters & b) {return a.Value