我正在编写一个频繁访问几百个单词的程序,所以不要将它们全部存储在.txt文件中,而是必须使用cpu和硬盘访问,处理和存储在矢量中我想将它们包含在内部该程序。这样做的最佳方法是什么? (同时保持源代码清洁)
该程序将在一个问题中使用代词,动词等识别名词。
(我正在使用MV)
*编辑 我想最好的选择是在初始化时根据下面的响应将数据加载到程序中。
答案 0 :(得分:4)
最好的方法是将它们存储在一个数组中,如果它们在编译时已经知道的话。
std::string words[] =
{
"foo" ,
"bar"
};
or
const char* words[] =
{
"foo" ,
"bar"
};
在程序中,您可以访问它们,如words[0]
和words[1]
等。根据您的操作系统,程序也允许嵌入资源。你也可以使用这种方法。
您也可以像现在一样存储它们。应该很快阅读Hunderds的单词。无关文件的优点是可以在不重新编译文件的情况下更改它们。但是可能会遇到以下缺点:当您分发程序时,您还必须分发额外的文件。用户可能会使用纯文本文件,但您也必须处理格式错误的输入文件。
您尚未提及计划如何访问这些字词。根据您的需要,您可能需要其他数据结构,例如set
,map
或甚至Trie
答案 1 :(得分:4)
如果不是C + 11,您可以使用boost::assign::list_of
初始化列表:
#include <boost/assign/list_of.hpp>
const std::set<std::string> words = boost::assign::list_of("word-one")
("word-two")
("word-three");
如果您要搜索lower_bound()
,那么使用已排序的容器会优先于未排序(允许使用words
),而且似乎就是这种情况。
答案 2 :(得分:3)
请勿将这些字词包含在可执行文件中。它们可能不会改变您的眼睛,但错误意味着重新编译和重新部署您的应用程序。
100个单词不是开销。 1000也不是。做明智的事情并把它们放在一个文本文件中。写一些代码将它们读入一个数组(如果你谷歌的话,有很多关于如何做到这一点的例子)。然后你只需要编辑你的文本文件来纠正即使用最小心的手也一定会出现的拼写错误。
我知道这并没有严格回答你的问题,但我也相信试图挽救其他人在做出错误决定时的挫败感:)
答案 3 :(得分:1)
在C ++ 98中有这样一个列表静态初始化并便于键入你需要使用数组。
std::string word_list[]={
"first", "second", "third"
};
然后可以加载到像这样的矢量
std::vector<std::string> word_vect(word_list, word_list+100);
另一种方法是对容器使用boost libaries + = operator。
std::vector<std::string> word_list;
word_list+="first", "second", "third" //and so on
见这里:http://www.boost.org/doc/libs/1_48_0/libs/assign/doc/index.html#operator+=
但是在c ++ 11中你可以这样做:
std::vector<std::string> word_list{
"first", "second", "third"
};
当然,您可以将其存储到文件中并加载它们(空格分隔)
std::vector<std::string> word_list; //create empty vector
word_list.reserve(100); //reserve 100 spaces (this is for efficiency)
std::ifstream file("path_to_file"); //open file
std::copy(std::istream_iterator<std::string>(file), //read all worlds
std::istream_iterator<std::string>(),
std::back_inserter(word_list)); //append to vector
答案 4 :(得分:0)
我想说这个问题的答案取决于你打算用这些词来做什么。例如,如果您要从这个巨大的列表中定期查找特定单词,那么最好选择字典结构 - 其中查找时间只是“needle”字符串中的字符数。