将大文本文件存储到向量中并在其上循环

时间:2017-06-13 09:49:01

标签: c++ file vector

我正在做一个大学项目,在我继续之前我有一个问题。我必须将' dictionary.txt' 导入到该程序中,以便它可以更正其他文件的文本。

现在我的 .txt 文件是20mb,里面有200万字。程序启动后,我将它存储到矢量中。加载所有单词需要2秒钟。

我的问题:这是在程序中导入这么多单词的正确方法吗?它背后的逻辑是来自" essay"将被发现超过200万个单词,直到找到并中断。

在我做到这一点之前,我想知道这是不是一个坏的或好的方法,为什么。

1 个答案:

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

通常,矢量应该是默认容器,如果遇到性能问题,那么可以考虑使用不同的容器。