用字符串中的2个键填充地图。字符和频率c ++

时间:2011-03-11 11:35:04

标签: c++ maps huffman-code

我是地图的新手,所以有点不确定最好的方法。该任务与使用霍夫曼编码的压缩有关。这是我拥有的。

#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();

我从文本文件中读取了一个字符串文件行。

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

这是我尝试填充地图的第二种方法,char值不正确,符号和笑脸..

    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 个答案:

答案 0 :(得分:3)

你的代码到处都是,它不是很连贯,所以很难理解这个流程。

以下是一些低光灯:

这是错误的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()在上面的方法中?如果有多条线怎么办?肯定不需要吗?

现在已经足够了,如果有更多问题,请清理您的代码并更新您的问题。

答案 1 :(得分:2)

一个修复和一个改进。

修复:在getFreq参考中创建第二个参数:

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

改进是:只需写

huffmanMap[i]++;

而不是

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

毕竟,通过写huffmanMap[i]?,你会检查它是否为零。如果为零,则将其设为1,与huffmanMap[i]++相同。