0

Q の後に U が続く単語を検索する次のコードがあります。このコードを切り詰めて、if ステートメントを 1 つだけ使用し、各組み合わせを検索する方法はありますか?

        if (word1.find("qq") != std::string::npos) {
            cout << word1 << endl;
        }
        if (word1.find("qa") != std::string::npos) {
            cout << word1 << endl;
        }
        //...
4

3 に答える 3

2

これに関する制限は、「quqa」をキャッチするとは思わないことです。

 if (word1.find('q') != std::string::npos 
       && word1.find("qu") == std::string::npos)
            cout << word1 << endl;

編集:これは「q」の数を数え、「qu」の数が同じであることを確認します。すべての文字通りの組み合わせを検索するよりもおそらく効率的だと思います。

size_t stringCount(const std::string& referenceString,
                   const std::string& subString) {

  const size_t step = subString.size();

  size_t count(0);
  size_t pos(0) ;

  while( (pos=referenceString.find(subString, pos)) !=std::string::npos) {
    pos +=step;
    ++count ;
  }

  return count;

}

bool check_qu(const std::string &word1)
{
    int num_q = stringCount(word1, "q");
    return (num_q > 0) ? 
         (stringCount(word1, "qu") == num_q) : true;
}
于 2013-10-18T05:52:57.990 に答える
0

これはどう?

const char *string_list[] = {
  "qq",
  "qa",
  "qz",
  ...
};

for (int i = 0; i < sizeof(string_list)/sizeof(*string_list); i++) {
    if (word1.find(string_list[i]) != std::string::npos) {
        cout << word1 << endl
    }
于 2013-10-18T06:07:51.290 に答える
0

すべての検索文字列をコンテナーに格納し、それをループします。

#include <vector>
#include <iostream>

int main(int, char**) {
  std::string word1 = "this is the string to search";
  std::vector<std::string> patterns;
  patterns.push_back("qq");
  patterns.push_back("qa");
  // etc.

  std::vector<std::string>::size_type i; // for better readability
  for (i = 0; i < patterns.size(); i++) {
    if (word1.find(patterns[i]) != std::string::npos) {
      std::cout << word1 << std::endl;
    }
  }
}
于 2013-10-18T05:57:21.790 に答える