如何在C ++中编译包含大量数据的向量?

时间:2012-07-17 22:25:55

标签: c++ arrays vector

我正在编写一个C ++程序来检查加泰罗尼亚语中是否存在某些单词,所以我有一个带有加泰罗尼亚语字典的向量:

const vector<string> dict={"aaron","ababol","abac","abaca","abacallanada","abacallanava","abacas","abacial", ... ,"zum-zum","zur","zuric","zwitterio"};

问题是字典有107776个条目,所以当我尝试编译文件时:

g++ -Wall file.cc -std=c++0x -o file.exe

它在一段时间内什么都不做,然后Windows说它没有响应并关闭它。

我该如何编译?有没有更好的方法来存储这种类型的数据(数组,......)?

4 个答案:

答案 0 :(得分:4)

你可能会对旧式内置阵列有更多好运:

char const * const dict[] = {"aaron",...};

这将生成一个字符串文字的加载和一个指向它们的指针数组,这对编译器来说不应该太过紧张。这也将不再使用必要的内存,在运行时很少或根本没有工作。

或者,std::array<char const *>应该同样有效,具有更多的C ++外观。

您的版本还必须生成大量代码来构建initializer_list,从每个代码构造一个字符串,并将每个字符串添加到向量中。它还需要两倍以上的内存,因为每个字符串文字需要复制到运行时分配的内存中,然后所有这些指针都需要存储在另一个运行时分配的数组中。

缺点是每次从字典中读取时都可能最终构造一个临时字符串。如果这是一个问题,那么std::string数组可能是一个合理的妥协。

答案 1 :(得分:3)

将其存储在外部文件中,并按需加载。这是最好的解决方案,否则我想你应该将你的矢量分成多个矢量,并可能将它们分成不同的cpp文件。

答案 2 :(得分:0)

将字典存储在文本文件中,每行一个字。然后将此代码添加到您的程序中:

{ 
  std::string inputFileName;
  std::ifstream inputFile(inputFileName);
  std::string word;
  while( std::getline(inputFile, word) )
    dict.push_back(word);
}

答案 3 :(得分:0)

是否可以使用其他答案中的方法从文件中加载一组字典,即只加载文件a.dic中的“a”字。或者您是否需要立即访问整个字典?