読者です 読者をやめる 読者になる 読者になる

情報科高専生のよくわからないいろいろ

プログラミングやってる人がチラシの裏感覚でいろいろ書いてたらこうなりました

C++でいわゆるsplit関数を書いてみた

いわゆるsplit関数(またはsplitメソッド)とは、”ある一つの文字列を、こちらが指定した区切り文字で区切って、複数の文字列で返す”というものだ。

何かと便利で需要のあるsplit関数。事実、自分もpaizaの問題を解いているときに、「split関数を使いたい」と思ったことがある。

自分はpaizaの問題を解くときは、基本C++を使う。しかしC++は、少なくともstringクラスには、split関数(splitメソッド)が実装されていない。当然割とよく使うであろうiostreamにもvectorにも実装されていない。つまり、split関数を使いたいのであれば自分で実装する必要がある。

というわけで実装した。今回は『対象の文字列の参照strと区切り文字delm』を引数に取る形のものを実装した。

まずは適当にソースコードと実行結果をコピペしたテキストファイルを。多分ソースコードコピペで動くと思う。

適当に説明を書いていく。

まず引数にてsplit対象の文字列の参照と区切り文字を受け取る。

vector<string> result : 最終的にsplit後の結果を格納しているはずの変数。(vectorについてよくわかんない方はググってください。)

vector<char> baka : 一時変数。元の文字列から、区切り文字で区切った際の文字列の一つを格納するはず。ちなみにbakaなのは筆者の頭である。

元の文字列を1つ1つ調べ、こちらが引数で指定した区切り文字がくるまでは、先ほど宣言したbakaに、律儀に1文字づつ追加していく。・・・これで区切り文字までの一つの文字列を格納したようだ。

区切り文字が来たのならば、resultのケツに、bakaに格納されている文字列を追加したい。そこで、「string tmp(baka.begin(), baka.end());」こうする。こうすると、char型のvector全体を一つの文字列型としてとり出せる(なお変数名は任意)。

そして「result.push_back(tmp);」でresultのケツに区切り文字までの文字列を突っ込み、bakaに格納されている要素を一旦全て消す。

このくだりを元の文字列の末尾まで繰り返す。

for文を抜けたら、最後に区切り文字がこなかったがために放ったらかしにされているbakaの中身をresultのケツに突っ込んで、元の文字列を区切って一つ一つ突っ込み終えたresultを戻り値として返して終わり。

ポインタとか参照とかそういったものの詳しいことは今回は省略。別の機会に自分なりに何かしら書ければと思っていたり。まあ自分もよくわかっていないんだけれども。

 

余談。

前回特にネットワークの知識がなくともフィルタリングを回避できてしまう方法を紹介した。設定画面の同じページ(?)に、「広告をブロックする」てきなチェックボックスがあったと思う。このブログを見るときは、広告をブロックしないで見て欲しいなあ・・・ VPNを有効にすると、接続速度が遅くなる。それだけだ。決してadをクリックしてほしいとかそういうのではない。