Заполнение карты 2 ключами от строки.Характер и частота с ++ - PullRequest
0 голосов
/ 11 марта 2011

Я новичок в картах, поэтому немного не уверен, как лучше это сделать. Эта задача связана со сжатием с кодированием Хаффмана. Вот что у меня есть.

#include <map>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

typedef map<char,int> huffmanMap;

void getFreq(string file, map<char, int> map) 
{ 
    map.clear();    
    for (string::iterator i = file.begin(); i != file.end(); ++i) {
        ++map[*i];   
    }
}

выше - один метод, который я нашел в Интернете, но не смог ничего напечатать

int main()
{
    map<char, int> huffmanMap;
    string fileline;

    ifstream myfile;
    myfile.open("text.txt",ios::out); 

    while(!myfile.eof())  {
    getline(myfile, fileline); //get the line and put it in the fileline string
    }
    myfile.close();

Я прочитал текстовый файл, чтобы заполнить строку fileline.

    for (int i=0; i<fileline.length(); i++) {
        char t = fileline[i];
        huffmanMap[i]? huffmanMap[i]++ : huffmanMap[i]=1;
    }

вот второй метод, который я пробовал для заполнения карты, значения символов неверны, символы и смайлики ..

    getFreq(fileline,huffmanMap);

    huffmanMap::iterator position;
    for (position = huffmanMap.begin(); position != huffmanMap.end(); position++)  {
        cout << "key: \"" << position->first << endl;
        cout << "value: " << position->second << endl;
    }

Вот как я пытался напечатать карту

    system("pause");
    return 0;
}

Когда я запускаю метод getFreq, программа вылетает. Я не получаю никаких ошибок с любым из них. Во втором методе значения char являются бессмысленными. Обратите внимание, что оба метода не работали одновременно, я просто добавил их оба, чтобы показать, что я пробовал.

Любое понимание будет оценено. Спасибо. Будьте снисходительны, я новичок;)

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

Ваш код повсюду, он не очень последовательный, поэтому его трудно понять.

Вот несколько слабых мест:

Это неправильно : myfile.open("text.txt",ios::out); - зачем открывать поток ввода с флагом out? это должно быть просто:

string fileline;
ifstream myfile("text.txt"); 

while(getline(myfile, fileline))  {
   // now use fileline.
}

В цикле while вы хотите перебрать содержимое и добавить его на карту? Теперь код выглядит так:

string fileline;
ifstream myfile("text.txt"); 

while(getline(myfile, fileline))  {
   getFreq(fileline, huffmanMap);
}

Следующее исправление, это неправильно : у вас есть typedef и переменная с тем же именем!

typedef map<char,int> huffmanMap;

map<char, int> huffmanMap;

Используйте разумное название

typedef map<char,int> huffmanMap_Type;

huffmanMap_Type huffmanMap;

Следующее исправление , ваша подпись метода getFreq неверна, вы передаете карту по значению (то есть по копии), а не по ссылке, следовательно, ваша модификация в функции - это копия, а не оригинал!

неправильно: void getFreq(string file, map<char, int> map)

правильно: void getFreq(string file, huffmanMap_Type& map)

Далее: почему clear() в вышеуказанном методе? Что если есть более одной строки? В этом нет необходимости?

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

2 голосов
/ 11 марта 2011

Одно исправление и одно улучшение.

Исправление: сделать второй параметр в getFreq ссылка:

void getFreq(string file, map<char, int> & map); //notice `&`

Улучшение: просто написать

huffmanMap[i]++;

вместо

huffmanMap[i]? huffmanMap[i]++ : huffmanMap[i]=1;

В конце концов, написав huffmanMap[i]?, вы проверяете, равен ли он нулю или нет.Если ноль, то вы делаете его равным huffmanMap[i]++.

...