这可能听起来像一个基本问题,它肯定是可以解决的,但我正在寻找一个快速而优雅的解决方案。
我想为我的程序创建一个保留字集合:
{"apple", "orange", "peach"}
它是常量,我希望能够在运行时检查字符串s
是否为保留字(f s
是集合的一部分)。
我考虑过使用std::set
,但我不想手动将每个保留字添加到集合中。此外,我不需要set的全部功能,例如我不需要添加新元素或删除元素。
这样做的优雅方式是什么?
答案 0 :(得分:6)
(c ++ 11):
const std::set<std::string> v = { "xyzzy", "plugh", "abracadabra" };
答案 1 :(得分:5)
您可以将单词存储在数组中,然后使用std::set
范围构造函数:
char const* raw_words[] = { "apple", "orange", "peach" };
std::set<std::string> const words(std::begin(raw_words), std::end(raw_words));
这使用了C ++ 11中新的begin
和end
函数,但你也可以在C ++ 03中使用指向第一个和第一个的指针来完成此操作数组的结束元素。
在C ++ 11中,您还可以使用初始化列表初始化std::set
,但并非所有编译器都支持此功能。
另请注意,如果单词集的内容永远不会更改,最好只使用带有std::vector<std::string>
和std::lower_bound
的已排序std::binary_search
来查找元素。您可能会发现这会表现得更好。
答案 2 :(得分:2)
我不想手动将每个保留字添加到集合中。
如果你的意思是你不想要代码如下:
reserved_word.insert("apple");
reserved_word.insert("orange");
reserved_word.insert("peach");
在某些必须在其他所有内容之前运行的初始化代码中,您可以改为(在C ++ 11中):
const std::set<std::string> reserved_word = {"apple", "orange", "peach"};
虽然这仍然在运行时执行初始化。
您也可以简单地使用预先排序的char const *reserved_word[] = { ... }
。这将完全避免需要任何运行时初始化。虽然您最好在源代码中获得排序,但是当您尝试使用其中一个排序序列搜索算法搜索单词时,您会遇到意外行为。
此外,我不需要set
的全部功能
我不相信这是避免它的一个很好的理由。避免某些事情的更好理由是,它是否允许您想要禁止的事物。例如,如果您确实想要阻止添加和删除内容,那么使用非const集合将不是最佳选择。但是因为你可以使用const集,所以不需要避免设置。