2016-06-06 8 views
0

Позвольте мне представить мой класс:станд :: 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’

+0

Ваше определение очереди выглядит неправильно? Вы пытаетесь использовать шаблоны 'set :: priority_queue ? Кроме того, lamba странно, создайте структуру, перегружая оператор() в качестве входного значения сравнения. – thorsan

+0

Да, это так, мое определение очереди должно выглядеть как std :: priority_queue (TreeOfLetters, std: set ? Я не понимаю, что третье предложение в вашем комментарии могло бы показать мне путь? – FieryCod

+0

Вы не можете использовать '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

ответ

3

Ваше определение функции Compare и очередь выглядит странно. Вы имели в виду что-то вроде этого? Это работает для меня в Visual C++

template <typename HType> 
class Huffman { 

    class TreeOfLetters { 
     HType Value; 
     char Letter; 
     TreeOfLetters *Root; 
     TreeOfLetters *Left; 
     TreeOfLetters *Right; 

     TreeOfLetters(HType _Value, char _Letter) : Value(_Value), Letter(_Letter), Root(nullptr), Left(nullptr), Right(nullptr){ 
     }; 


    }; 

    struct Compare 
    { 
     bool operator()(const TreeOfLetters& a, const TreeOfLetters& b) 
     { 
      return a.Value < b.value; 
     } 
    }; 

    std::priority_queue<TreeOfLetters, std::vector<TreeOfLetters>, Compare> queue; 

public: 
    Huffman(std::initializer_list<HType> _Values, std::initializer_list<char> _Chars) : queue(Compare()) {} 
    Huffman(const Huffman& orig) = delete; 

}; 

или вы можете осуществить сравнение как лямбда

std::priority_queue<TreeOfLetters, std::vector<TreeOfLetters>, [](const TreeOfLetters& a, const TreeOfLetters& b){return a.Value < b.value;}> queue; 

Вы должны ограничить HType к базовым ценностям, используя некоторые черты, или же вы должны реализовать " > "для фактического HType, который вы хотите использовать.

См. Также комментарий @ Петра Скотницкого выше.

+0

Не могли бы вы рассказать мне, что такое перегрузка оператора()? Есть ли способ заставить его работать с использованием lamdas? – FieryCod

+0

Вы перегружаете оператор(), т. Е. Вы можете вызвать объект Compare struct как obj (a, b), т. Е. Как функцию. Возможно, вы можете использовать лямбда – thorsan

+0

Хорошо, я избавляюсь от 2 из 3 предупреждений. Теперь я получаю предупреждение о возврате a.Value , Compare> queue; не удалось разрешить очередь идентификаторов – FieryCod

Смежные вопросы