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

C++ 创建字符串c+的常量集集合+;,c++,stl,C++,Stl,这听起来可能是一个基本问题,当然是可以解决的,但我正在寻找一个快速而优雅的解决方案 我想为我的程序创建一组保留字: {“苹果”、“橘子”、“桃子”} 它是常量,我希望能够在运行时检查字符串s是否是保留字(fs是集合的一部分) 我曾考虑过使用std::set,但我不想手动将我的每个保留字添加到集合中。此外,我不需要集合的全部功能,例如,我不需要添加新元素或删除元素 什么是优雅的方法?您可以将单词存储在数组中,然后使用std::set范围构造函数: char const* raw_words[] =

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

我想为我的程序创建一组保留字:
{“苹果”、“橘子”、“桃子”}

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

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


什么是优雅的方法?

您可以将单词存储在数组中,然后使用
std::set
范围构造函数:

char const* raw_words[] = { "apple", "orange", "peach" };

std::set<std::string> const words(std::begin(raw_words), std::end(raw_words));
char const*原始单词[]={“苹果”、“橘子”、“桃子”};
std::set const words(std::begin(raw_words),std::end(raw_words));
这利用了C++11中新的
begin
end
函数,但您也可以在C++03中使用指向数组的第一个和一个结束元素的指针来实现这一点

在C++11中,您还可以使用初始值设定项列表来初始化
std::set
,尽管并非所有编译器都支持此功能

还请注意,如果单词集的内容从未更改,则最好使用排序的
std::vector
std::lower_bound
std::binary_search
来查找元素。在现代C++(C++ 11)中,

< p>:

const std::set v={“xyzy”、“plugh”、“abracadabra”};
我不想手动将每个保留字添加到集合中

如果您的意思是不希望代码看起来像:

reserved_word.insert("apple");
reserved_word.insert("orange");
reserved_word.insert("peach");
在某些必须先运行的初始化代码中,您可以改为(在C++11中):

const std::set reserved_word={“apple”、“orange”、“peach”};
尽管这仍然会在运行时执行初始化

您也可以简单地使用预先排序的
字符常量*保留字[]={…}
。这将完全避免任何运行时初始化的需要。尽管您最好在源代码中正确排序,否则当您尝试使用排序序列搜索算法之一搜索单词时,将出现意外行为

此外,我不需要设置的全部功能


我不认为这是避免它的好理由。避免某些事情的一个更好的理由是如果它允许你不允许的事情。例如,如果您确实想要阻止添加和删除内容,那么使用非常量集将不是最佳选择。但是,既然您可以使用常量集,就没有必要避免使用set。

如果您不希望使用
std::set
来表示集合,请使用数组和
std::find
。这就是我需要的。尝试使用字符串数组而不是
char*
来执行此操作。谢谢。
std::string原始单词[]
也可以。我选择了
char const*
,以避免
std::string
带来不必要的开销。由于
原始单词
的唯一用途是初始化
单词
,那里不需要
std::string
的功能。
std::set
std::string
都是
constepr
友好的:-你应该删除你的答案以避免传播错误信息。@VittorioRomeo我用
constepr
替换了
constepr
reserved_word.insert("apple");
reserved_word.insert("orange");
reserved_word.insert("peach");
const std::set<std::string> reserved_word = {"apple", "orange", "peach"};