プログラムに慣れていくためにやり始めた Aizu Online Judge は始めて半月ぐらい経過したが意外と続いています。以前にも書いたかもしれませんが、普段のしごとではPLCでラダーを書く事が多いので、あまり言語系のプログラムを書きません。入門書をやっただけで終わっていまいそれ以上のレベルになかなか行けないので、アウトプットするために始めました。
問題をこなしていくたびに、いろいろと発見があるのでそれを書いていくことにします。表題にあるように今回はC++11で大文字小文字を区別せずに文字列を検索することをわかりました。C++では文字列を検索するには。stringクラスのfindを使えばよいのですが、大文字と小文字が区別されてしまいます。<algorithm>にも大文字と小文字が区別しないで検索する方法はありますが、書き方が面倒なようなので、今回は正規表現を使いました。
やり方としては正規表現オブジェクトを作成するときに、大文字小文字区別なしを示すicaseオプションをつけるだけ。あとはregex_match関数で市レベルだけです。
今回の問題は、標準入力で最初に探す元の文字列、次に探されるがわの文字列。END_OF_TEXTで終了という内容だったので、下記のようなプログラムになりました。
#include <iostream>
#include <regex>
using namespace std;
int main()
{
string W,T;
int count=0;
cin >> W;
regex re(W,regex_constants::icase);
while(1){
cin >> T;
if(T == "END_OF_TEXT") break;
if(regex_match(T,re)) count++;
}
cout << count << endl;
return 0;
}
<regex>はC++11から対応なので、C++11を選択することを忘れずに。試しにC++で投稿したら当然コンパイルエラーになりました。