С++. Проблема  
Автор Сообщение

2
Сообщение С++. Проблема

Доброй ночи.

Перейду сразу к делу - нужно реализовать метод Хаффмана на С++, до того момента, когда символы в строке получают ужатое значение. И вот нужно вывести символы и эти их ужатые значения. Код есть:

#include "stdafx.h"
#include <iostream>
#include <map>
#include <vector>
#include <list>
#include <fstream>
#include <string>
using namespace std;

 

//узел значений

class Node
{
public:
 int a;
 char c;
 Node *left, *right;

 Node(){left=right=NULL;}

 Node(Node *L, Node *R)
 {
  left = L;
  right = R;
  a = L->a + R->a;
 }
};

 

//сортировка узлов

struct MyCompare
{
 bool operator()(Node* l, Node* r) const
 {
  return l->a < r->a;
 }
};

 

//сжатие

vector<bool>code;
map<char,vector<bool> > table;
void BuildTable(Node *root)
{
  if (root->left!=NULL)
  {
   code.push_back(0);
   BuildTable(root->left);
  }

if (root->right!=NULL)
 {
  code.push_back(1);
  BuildTable(root->right);
 }
if (root->c)
table[root->c]=code;

code.pop_back();
}

 

 

int main()
{
 string s;
 getline (cin, s);

 

//символ и кол-во его вхождений
 map <char,int> m;

 for (int i=0; i<s.length(); i++)
 {
  char c = s[i];
  m[c]++;
 }

 

//слепить из символов узлы и сунуть их в list

 list<Node*> t;


 map <char,int>::iterator i;
 for(i = m.begin(); i != m.end(); ++i)
 {
  Node *p = new Node;
  p->c = i->first;
  p->a = i->second;
  t.push_back(p);
 }

 

//отсортировать узлы по кол-ву вхождений от наим.

 while (t.size()!=1)
 {
  t.sort(MyCompare());

  Node *SonL = t.front();
  t.pop_front();
  Node *SonR = t.front();
  t.pop_front();

  Node *parent = new Node(SonL, SonR);
  t.push_back(parent);
 }

 Node *root = t.front();

 

//сжатие

 BuildTable (root);


//вывод сжатой строки
 for (int i=0; i<s.length(); i++)
 {
  char c=s[i];
  vector<bool> x = table[c];
  for (int n=0; n<x.size(); n++)
  cout<<x[n];
 }


 cout<<endl;
 system("pause");
 return 0;
}



Все работает, но в итоге нам нужен не вывод сжатой строки, как получилось, а, как уже сказал выше, символов и их сжатых значений. Пробовал слепить итератор к  

vector<bool>code;
map<char,vector<bool> > table;

(это сжатие)

Получалось так, но компилятор ругался на выделенную чатсь.

...

//сжатие

BuildTable (root);

 

map<char,vector<bool> >::iterator ii;

for (ii=table.begin(); ii!=table.end(); ii++)

cout << ii-> first << ":" << ii->second << endl;

 

cout<<endl;
system("pause");
return 0;
}

 

ЧЯДНТ? В вузе нас не учили кодить, так что мучаю сам по Дейтелу, 5е издание (может еще какие книги засоветуете?). Опыта ноль, начинающий кодер, буду очень благодарен за исправления/подсказки/объяснения. Знаю, что в инете тьма реализаций метода Хаффмана, но там совсем непонятная для меня дичь.
Спасибо!



02 дек 2013, 03:38
Профиль



<Бехолдэрс>


Сервер: Черный Шрам
Рейтинг поля боя: 1145
2х2: 1665
3х3: 2143
5х5: 1670
1
Сообщение С++. Проблема

wtfcoilmiss писал(а):

Доброй ночи.

Перейду сразу к делу - нужно реализовать метод Хаффмана на С++, до того момента, когда символы в строке получают ужатое значение. И вот нужно вывести символы и эти их ужатые значения. Код есть:

ЧЯДНТ? В вузе нас не учили кодить, так что мучаю сам по Дейтелу, 5е издание (может еще какие книги засоветуете?). Опыта ноль, начинающий кодер, буду очень благодарен за исправления/подсказки/объяснения. Знаю, что в инете тьма реализаций метода Хаффмана, но там совсем непонятная для меня дичь.
Спасибо!

Мне мой друг-программист советовал пользоваться книгами Архангельского, справочное пособие и программирование в с++



02 дек 2013, 06:29
Профиль

0
Сообщение С++. Проблема

Что говорит компилятор то запили



02 дек 2013, 07:07
Профиль

1
Сообщение С++. Проблема

for(i = m.begin(); i != m.end(); ++i)
{
vector<bool> x = table[i->first];
cout<<i->first<<"=";
for (int n=0; n<x.size(); n++) cout<<x[n];
cout<<endl;

}

 там где вывод сжатой строки поменяй. если я правильно понял вопрос а то я не спал уже 2 суток. и на будующее учись анализировать код. это задание у меня заняло 5 минут.

 

 

#759



02 дек 2013, 08:09
Профиль Skype

0
Сообщение С++. Проблема

я так понимаю что ТС-у помогли и тема закрыта? втф, что случилось с пг...



02 дек 2013, 12:07
Профиль

0
Сообщение С++. Проблема

Архангельского поищу, код фурычит, спасибо большое!) А ведь и правда просто было...



02 дек 2013, 20:04
Профиль
Начать новую тему Ответить на тему


Перейти:  

На сайте использованы материалы, принадлежащие Blizzard Entertainment. Копирование материалов возможно только c разрешения портала. В противном случае это будет называться уже другим словом.
Рейтинг@Mail.ru