トップページ⇒tech
84コメント25KB

【C++】最強のSplitクラスを作ろう!【無いから】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/11/09(水) 00:22:13
Split関数って知ってるよね?
俺はVBやってちょっと使ってみただけなんだけど便利なんだよ。これ。
で、業務で使えるぐらい便利にならんかと色々と考えたわけよ。
んでも、俺って文字列処理あんまよく知らないし苦手なんだよね。

なんで、プログラム晒すと話が中々進まないから、
超便利なSplitクラスの仕様をみんなで考えようというわけよ。
はじめに何もないとアレだからとりあえず俺が考えたとk
0072702006/12/08(金) 01:05:12
いや、文字列の最後を明示的にテストすればいいのか。
泥臭いけど、できないことはないということで。
0073デフォルトの名無しさん2006/12/08(金) 01:24:31
>>71
>>59の通り、token_iterator<>::base()で元のイテレータ型で現在位置を示すイテレータが手に入るから、
別のtokenizerを作ってやるなりtokenizer::asign呼ぶなりで途中からの変更が可能。
0074デフォルトの名無しさん2006/12/08(金) 01:25:25
typo。疲れてるな。寝よう。
-asign
+assign
0075デフォルトの名無しさん2006/12/08(金) 01:30:12
ちゅうか、途中で区切り文字を変える必要はあるのか?

a = "abc,efg,\"h,i\nj\",klm,n\0"を
a = "abc\0efg\0\"h\0i\nj\"\0klm\0n\0"にしてから
a = "abc\0efg\0\"h,i\nj\"\0klm\0n\0"にすればいいんじゃないのか?
0076デフォルトの名無しさん2006/12/09(土) 01:26:59
>>73,75
例えば↓のような文字列をトークン単位で分割できるか?
for(i=0;i<size;i++){unko("うんこ?\"Yes/No\"");}

結果は

for ( i = 0 ; i < size ; i + + ) { unko ( " うんこ? "Yes/No" " ) ; }

って感じになるようにしたい。
(tokenizerはなんか俺のしたかったことがことごとく
できないような気がしたんだが今となってはなんでできなかったのか正直忘れてしまったぜw
ただ、俺がアフォだったからじゃなくて、なんかの機能がなくてできなかった気がするぜw)
0077デフォルトの名無しさん2006/12/09(土) 01:54:39
それは字句解析。tokenizerの仕事じゃないよ。
boost::spiritでも使いなされ。
0078デフォルトの名無しさん2006/12/09(土) 05:25:22
>>76
なんか、>>1で言ってるのと全然違うもんじゃないですか...
そう言う形でと言うのなら、検索の仕方から全然違う物になると思いますよ
単純に、","であるとか"\r\n"であるとか、"<BR>"であるとかを句切り符号にして区切るようなルーチンであれば、対象の先頭から何も考えず調べればいいけれど

その場合だと、半角記号(空白含むダブルクォーテーション除く)と一致するかどうかを調べる方が早いと思うのですが...

for(i=0;i<size;i++){unko("うんこ?\"Yes/No\"");}
この場合だと、
'(' ')' ';' '<' '+' '{' '}'
と一致する文字を探すルーチンを作る方が簡単ではないでしょうか?
この場合、単純な1文字の検索なんで、検索の工夫といっても限られるとは思いますが...
0079デフォルトの名無しさん2006/12/09(土) 06:55:39
>>77,78
なるほど。
そこまでいくとパーサジェネレータみたいなの作ったほうが早いのか・・・。
結局、どこまでサポートするか?
って話になるのか。

でも、あんまり厳密なのもいらないし、特に演算子みたいなのも気にする必要もないから
パーサジェネレータまでは必要ないなぁ。

>その場合だと、半角記号(空白含むダブルクォーテーション除く)と一致するかどうかを調べる方が早いと思うのですが...
>for(i=0;i<size;i++){unko("うんこ?\"Yes/No\"");}
>この場合だと、 '(' ')' ';' '<' '+' '{' '}'
例えばこれも { と ( を区切り(+トークン)として認識出来さえすればはじめの一発目で

for ( i=0;i<size;i++ ) { unko ( "うんこ?\"Yes/No\"" ) ; }

ここまでもってこれちゃうからこの辺の幅を捨てるのは惜しいと思うんだよね。
0080デフォルトの名無しさん2006/12/10(日) 01:16:11
spiritが大げさだというならregexはどうだ?
0081デフォルトの名無しさん2006/12/14(木) 16:40:35
(っ´▽`)っ上げ
0082デフォルトの名無しさん2006/12/26(火) 02:47:06
一年も経つのに、まだできてないの?
というか、作るスキルないから、boost流用って流れになってるのか?
0083デフォルトの名無しさん2006/12/26(火) 14:30:33
xpressiveのtoken_iteratorでいいじゃない
0084デフォルトの名無しさん2007/04/18(水) 22:03:15
>>81 カワイイ
■ このスレッドは過去ログ倉庫に格納されています