“优化方式”
如果我们忽略“过早的优化是万恶之源”,标准的做法是添加一个比较器,这很容易写:
struct MyCharComparator
{
bool operator()(const char * A, const char * B) const
{
return (strcmp(A, B) < 0) ;
}
} ;
与 a 一起使用:
std::set<const char *, MyCharComparator>
标准方式
用一个:
std::set<std::string>
即使您将静态 const char * 放入其中,它也会起作用(因为 std::string 与 const char * 不同,其内容具有可比性)。
当然,如果你需要提取数据,你必须通过std::string.c_str()来提取数据。另一方面,但由于它是一个集合,我想您只想知道“AAA”是否在集合中,而不是提取“AAA”的值“AAA”。
注意:我确实读过“请不要建议创建 std::strings”,但是,你问的是“标准”方式......
“从不做”的方式
我在回答后注意到以下评论:
请不要建议创建 std::strings - 这是浪费时间和空间。字符串是静态的,因此可以根据它们的地址来比较它们的(不)相等性。
这有点 C 的味道(使用已弃用的“静态”关键字,用于 std::string bashing 的可能过早优化,以及通过它们的地址进行字符串比较)。
无论如何,你不想通过它们的地址来比较你的字符串。因为我猜你想要的最后一件事是有一个包含:
{ "AAA", "AAA", "AAA" }
当然,如果只使用相同的全局变量来包含字符串,那就另当别论了。
在这种情况下,我建议:
std::set<const char *>
当然,如果您比较具有相同内容但变量/地址不同的字符串,它将不起作用。
而且,当然,如果静态 const char *字符串是在标头中定义的,则它不适用于这些字符串。
但这是另一个故事。