1

私はC++を学んでおり、次のことを行うための最良または最も慣用的な方法は何だろうと思っています。プログラムで一定になる既知の受け入れられた文字列のリストがあります。関数に提供された文字列が、受け入れた文字列のリストに含まれているかどうかを知りたいです。私が思いついた:

bool match(const char* foo, const char* bar) {
    return strcmp(foo, bar) == 0;
}

bool thingIsValid(const char* thing) {
    return match("foo", thing) || match("bar", thing) || match("baz", thing);
}

...
thingIsValid(someArg.c_str());
...

このアプローチは、私には C のイディオムのように思えます。他の言語では、おそらくリストを持っていて、そのリストで .contains(thing) を実行します。人々は通常、C++ でこれをどのように行うのでしょうか?

4

3 に答える 3

6

おそらく、最近の最良の方法は、順序付けられていないセットを使用することです。

std::unordered_set<std::string> ValidValues {"one", "two", "three"};

if( ValidValues.find( testString ) == ValidValues.end() ) {
    // String is not valid...
}

ここでの唯一の実際の欠点は、実行可能イメージに有効な文字列を単純に配置できないことです。(セットをセットアップするには、初期化コードとヒープの割り当てが必要です。) しかし、それは大部分のアプリケーションにとって実際には問題になりません。

于 2013-01-11T18:42:18.197 に答える
2

それを行う1つの可能な方法:

bool thingIsValid(const std::string &thing) {
  static const std::vector<std::string> validValues {"foo", "bar", "baz"};
  return std::find(validValues.begin(), validValues.end(), thing) != validValues.end();
}

上記のコードでは、C++11 のリスト初期化を使用してvector. C++11 がない場合は、 を使用してベクトルを構築する必要がありますpush_back()

于 2013-01-11T18:36:15.423 に答える
1

std::string::findあなたが探しているものです。 参照

于 2013-01-11T18:33:38.183 に答える