我正在尝试读入单词列表并将它们保存在C ++ STL hash_map中,以及它们在按字母顺序排序的文件中的位置。这个想法是后来我需要能够判断一个字符串是否是一个单词,以及它是在一个不同的单词之前还是之后。
ifstream f_dict ("dictionary.txt");
__gnu_cxx::hash_map <const char*, int> dictionary;
string temp_str;
int counter = 0;
while (!f_dict.eof()) {
f_dict >> temp_str;
dictionary.insert(make_pair(temp_str.c_str(), counter++));
}
我遇到的问题是它没有保存实际的单词。下面的for loop
打印出一系列单词,但iter->first
始终为空。我错过了什么?
__gnu_cxx::hash_map<const char*, int>::iterator iter;
int i = 0;
for (iter = dictionary.begin(); iter != dictionary.end() && i < 150; iter++) {
cout << "word: " << iter->first << " index: " << iter->second << "\n";
i++;
}
答案 0 :(得分:4)
您正在尝试为每个单词存储相同的const char *,因为您从不为从文件中提取的单词创建任何新内存。如果打印出从temp_str.c_str()
返回的指针,则对于第一个循环中的每个调用都是相同的。在你的第二个循环中,你为地图中的每个记录打印出相同的字符*(注意只有1个b / c映射不允许重复),在第一个循环中或在它之间设置为空字符串。你的循环。
以下是演示问题和解决方案的示例代码。
#include <fstream>
#include <iostream>
#include <map>
using namespace std;
int main (int argc, char **argv)
{
ifstream file("test.txt");
map<const char *, int> dictionary;
map<string, int> strDictionary;
string temp_str;
int counter = 0;
while (!file.eof())
{
file >> temp_str;
cout << "PARSED: " << temp_str << "\n";
cout << "INSERTING: " << (unsigned long) temp_str.c_str() << "\n";
dictionary.insert(make_pair(temp_str.c_str(), counter));
strDictionary.insert(make_pair(temp_str, counter));
counter++;
}
cout << "Dictionary Size: " << dictionary.size() << "\n";
cout << "Str Dictionary Size: " << strDictionary.size() << "\n";
for (map<const char*, int>::const_iterator iter = dictionary.begin();
iter != dictionary.end();
++iter)
{
cout << "CHAR * DICTINARY: " << iter->first << " -> " << iter->second << "\n";
}
for (map<string, int>::const_iterator iter = strDictionary.begin();
iter != strDictionary.end();
++iter)
{
cout << "STR DICTIONARY: " << iter->first << " -> " << iter->second << "\n";
}
return 1;
}
答案 1 :(得分:0)
你想使用std :: string作为你的密钥类型,而不是const char *,否则不会复制字符串,你最终会在每个插入上使用相同的密钥。