「最適化された方法」
「時期尚早の最適化はすべての悪の根源」を無視する場合、標準的な方法はコンパレーターを追加することです。これは簡単に記述できます。
struct MyCharComparator
{
bool operator()(const char * A, const char * B) const
{
return (strcmp(A, B) < 0) ;
}
} ;
で使用するには:
std::set<const char *, MyCharComparator>
標準的な方法
使う:
std::set<std::string>
内部に static const char * を入れても機能します (const char * とは異なり、std::string はその内容によって比較できるため)。
もちろん、データを抽出する必要がある場合は、std::string.c_str() を介してデータを抽出する必要があります。一方、 ですが、セットなので、「AAA」の値「AAA」を抽出するのではなく、「AAA」がセットに含まれているかどうかだけを知りたいと思います。
注:「std :: stringの作成を提案しないでください」について読みましたが、「標準」の方法を尋ねました...
「絶対にしない」方法
回答後に次のコメントを書き留めました。
std::strings の作成を提案しないでください - 時間とスペースの無駄です。文字列は静的であるため、アドレスに基づいて (不) 等号を比較できます。
これは C のにおいがします (非推奨の "static" キーワードの使用、std::string バッシングに使用される時期尚早の最適化、およびそれらのアドレスによる文字列比較)。
とにかく、文字列をアドレスで比較したくありません。あなたが望む最後のことは、次のものを含むセットを持つことだと思うからです:
{ "AAA", "AAA", "AAA" }
もちろん、文字列を格納するために同じグローバル変数のみを使用する場合、これは別の話です。
この場合、次のことをお勧めします。
std::set<const char *>
もちろん、内容が同じで変数・アドレスが異なる文字列同士を比較してもうまくいきません。
もちろん、静的な const char *文字列がヘッダーで定義されている場合、それらの文字列では機能しません。
しかし、これは別の話です。