我正在做一个大学项目,在我继续之前我有一个问题。我必须将' dictionary.txt' 导入到该程序中,以便它可以更正其他文件的文本。
现在我的 .txt 文件是20mb,里面有200万字。程序启动后,我将它存储到矢量中。加载所有单词需要2秒钟。
我的问题:这是在程序中导入这么多单词的正确方法吗?它背后的逻辑是来自" essay"将被发现超过200万个单词,直到找到并中断。
在我做到这一点之前,我想知道这是不是一个坏的或好的方法,为什么。
答案 0 :(得分:0)
如果您只想存储单词本身,std :: vector是一个不错的选择,但您应该知道发生的重新分配。
如果字典意图保持相同的大小,你应该考虑为矢量保留内存。
基本上你想做这样的事情:
void from_file(std::vector<std::string>& content, std::string pathAndFilename = "")
{
content.reserve(1000000) //the size your dictionary has in words
std::fstream readContent;
if (pathAndFilename.empty())
{
readContent.open("file.txt", std::ios_base::in);
}
else
{
readContent.open(pathAndFilename.c_str(), std::ios_base::in);
}
std::string currentLine;
while (std::getline(readContent, currentLine))
{
content.push_back(currentLine);
}
readContent.flush();
readContent.clear();
readContent.close();
}
向量的问题是,搜索需要很长时间。如果你可以确保你的dictionary.txt中的每个单词都是唯一的,那么就可以使用一个集合,因为集合是一个树容器并且搜索速度要快得多。
如果您订购了矢量但是您无法到达地图附近的任何内容/设置性能,则可以提高矢量搜索的性能。然而,您必须准备字典以供使用。
此外,您可以将字典拆分为较小的子向量(一个用于Aa,一个用于Bb等)。这将进一步提高您的表现,因为您可以从正在尝试纠正的单词的开头字母开始。
地图不适合这种情况,因为地图用于存储密钥和值。关键也必须是独一无二的。好的,你可以使用你的单词作为键,只需使用int id作为值,但你也可以使用一个集合。
总的来说,矢量是不错的选择,并且在这种情况下性能应该没问题(即使地图会做得更好),但是如果你想要达到最佳性能,那么设置就是你要找的。 / p>
通常,矢量应该是默认容器,如果遇到性能问题,那么可以考虑使用不同的容器。