Я работаю над файлом C ++, который может выполнять кодирование Хаффмана, и столкнулся с небольшой проблемой при переходе от карты типа string и int к очереди типа Node
, и мне было интересно, есть ли способчтобы определить явное преобразование из пары строк и целых чисел в Node
.
В настоящее время у меня есть так, что карта преобразуется в вектор пар, а затем преобразуется в вектор типа Node
затем в очередь с приоритетами типа Node
.
// this->char_freqs is of type map<std::string, int>
std::vector<std::pair<std::string, int> > my_vector(this->char_freqs.begin(), this->char_freqs.end());
std::vector<Huffman::Node*> real_vector;
for (unsigned int i = 0; i < my_vector.size(); ++i) {
real_vector.push_back(new Huffman::Node(my_vector[i].first, my_vector[i].second));
}
std::priority_queue<Huffman::Node*, std::vector<Huffman::Node*>, Huffman::comp> PQ(real_vector.begin(), real_vector.end());
Я еще не проверял, будет ли это работать.Тем не менее, я больше стремлюсь разработать метод, который мог бы явно определить преобразование из pair<string, int>
в Node*
, чтобы переход от карты к очереди мог выполняться по существу в одну строку.Что-то вроде:
std::priority_queue<Huffman::Node*, std::vector<Huffman::Node*>, Huffman::comp> PQ(this->char_freqs.begin(), this->char_freqs.end());
При чтении документации я нашел только примеры преобразования пользовательских типов в типы по умолчанию, а не наоборот.
Редактирование 1
Надеюсь, это должно быть проще и объяснить, что я ищу.
class Node {
public:
char character;
int frequency;
Node(char char_, int val_) {
character = char_;
frequency = val_;
}
operator std::pair<char, int>() {
return std::pair<char, int>(character, frequency);
}
};
int main(int argc, char** argv) {
std::vector<std::pair<char, int> > my_vector_1;
Node n('a', 3);
my_vector_1.push_back(n); // Can use a Node as an input since the conversion has been explicitly defined
std::vector<Node> my_vector_2;
std::pair<char, int> pair('a', 3);
my_vector_2.push_back(pair); // Invalid
}
Конечно, неверный параметр потерпит неудачу, потому что компилятор не имеет способа конвертировать пару в узел, но можно ли заставить работать недопустимую строку?