我想把字典存储在一个列表向量中。每个列表包含所有在字母表中具有相同首字母的单词。(例如ananas,apple)我的问题是我无法将const char* 数组中以“z”开头的单词读入列表。有人能给我解释一下为什么以及如何解决这个问题吗/有没有一种方法可以用const char* 实现它?谢谢!
#include <iostream>
#include <list>
#include <vector>
#include <iterator>
#include <algorithm>
#include <string>
#include <fstream>
std::pair<bool, std::vector<std::list<std::string>> > loadwithList()
{
const char* prefix = "abcdefghijklmnopqrstuvwxyz";
std::vector<std::list<std::string>> dictionary2;
std::ifstream infile("/Users/User/Desktop/Speller/Dictionaries/large", std::ios::in);
if (infile.is_open())
{
std::list<std::string> data;
std::string line;
while (std::getline(infile, line))
{
if (line.starts_with(*prefix) && *prefix != '\0')
{
data.push_front(line);
}
else
{
dictionary2.push_back(data);
data.clear();
prefix++;
}
}
infile.close();
return std::make_pair(true, dictionary2);
}
std::cout << "Cant find file\n";
return std::make_pair(false, dictionary2);
}
int main()
{
auto [loaded, dictionary2] = loadwithList();
if (!loaded) return 1;
}
2条答案
按热度按时间pw9qyyiw1#
您丢失了'a'后面每个字母的第一个单词,这是因为当您到达下一个字母的单词时,
if(line.starts_with(*prefix) && *prefix != '\0')
失败,只有这样您才能转到下一个字母,但也会转到下一个单词。您丢失了整个字母“z”,因为在文件的最后一行之后-
if(line.starts_with(*prefix) && *prefix != '\0')
在这一点上已经成功-while (std::getline(infile, line))
终止,您错过了dictionary2.push_back(data);
。bq9c1y662#
答案已经给出,问题也已解释。
基本上你需要一个双嵌套循环。外循环将一个字一个字地读,内循环将检查“前缀”中每个字符的mtach。这将是大量的循环。
而且效率不高,最好先用
std::map
来存储数据,如果你真的需要std::lists
的std::vector
,那么我们可以复制数据,我们会注意只存储小写字母作为std::map
的键。出于测试目的,我加载了一个包含here中单词的列表,其中大约有450'000个单词。
我在我的演示程序中使用了这个。
请参见以下一个潜在的解决方案建议: