创建字符串c ++的常量集合集合

时间:2012-06-09 21:43:38

标签: c++ stl

这可能听起来像一个基本问题,它肯定是可以解决的,但我正在寻找一个快速而优雅的解决方案。

我想为我的程序创建一个保留字集合: {"apple", "orange", "peach"}

它是常量,我希望能够在运行时检查字符串s是否为保留字(f s是集合的一部分)。

我考虑过使用std::set,但我不想手动将每个保留字添加到集合中。此外,我不需要set的全部功能,例如我不需要添加新元素或删除元素。

这样做的优雅方式是什么?

3 个答案:

答案 0 :(得分:6)

现代c ++中的

(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中新的beginend函数,但你也可以在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集,所以不需要避免设置。