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

このエントリーをはてなブックマークに追加
35デフォルトの名無しさん:2005/11/10(木) 23:25:32
>>28
>>8の内容が全部できるなら、中断したときにデリミタを変更して再開すればできるんじゃないの?
なんでできないの?
36マイク ◆yrBrqfF1Ew :2005/11/10(木) 23:57:30
それじゃあこのスレッドはここらへんから
地球シュミレータで動かしている地球をシュミレーションするソフトを
なんとなく真似して開発してみるスレッドに変わったわけか。
37デフォルトの名無しさん:2005/11/11(金) 01:19:40
>>36
シュミレータって何?
38デフォルトの名無しさん:2005/11/11(金) 08:05:31
シュミレータ(笑)
39デフォルトの名無しさん:2005/11/11(金) 18:56:40
そこらのおっさんなら間違えてもしょうがないが、
プログラマーには間違って欲しくないな。
40デフォルトの名無しさん:2005/11/11(金) 19:21:20
実際の発音はシュのほうが近いよ
ミじゃないけどね
41デフォルトの名無しさん:2005/11/11(金) 19:46:04
>>40
はぁ?
42デフォルトの名無しさん:2005/11/11(金) 19:54:05
実際の発音もシミュ(スィミュ)だと思うぞ
43デフォルトの名無しさん:2005/11/11(金) 19:55:44
スィなんて表記は正しい日本語じゃないよ
おまえら脳みその替わりに苺か薔薇でも詰まってるんじゃね?
44デフォルトの名無しさん:2005/11/11(金) 21:05:51
バラ肉でした(爆)
45デフォルトの名無しさん:2006/02/22(水) 03:05:10
boost::spilit で >>8 はできる。
46デフォルトの名無しさん:2006/03/18(土) 09:16:26
マジレスしちゃだめw
47デフォルトの名無しさん:2006/04/26(水) 06:47:57
>>45
かなり前のレスだけど4と5ってどうやってやればいいの?
48デフォルトの名無しさん:2006/04/26(水) 09:05:47
>>47
リファレンスを流し読みしただけだが、イテレータ使えばいいだけだろ
49デフォルトの名無しさん:2006/04/26(水) 14:45:45
単に分割するだけなくCSV読み込みが出来るといい。
50デフォルトの名無しさん:2006/04/26(水) 14:53:19
単に書き散らすのでなくちゃんとした日本語を書けるといい。
51デフォルトの名無しさん:2006/04/27(木) 00:22:32
>>48
わからない。
どうやればいいの?
52デフォルトの名無しさん:2006/04/27(木) 00:24:06
>>49
>>8の1と3ができればCSVは楽に読めると思う。
53デフォルトの名無しさん:2006/04/27(木) 11:51:23
>>50
わからない。
どうやればいいの?
54デフォルトの名無しさん:2006/11/02(木) 18:33:01
結局boostで出来たのw?
55デフォルトの名無しさん:2006/11/03(金) 19:25:45
Boost.Spirit使えばいいじゃない
56デフォルトの名無しさん:2006/11/09(木) 07:14:01
>>54
できないと思われ。
57デフォルトの名無しさん:2006/11/09(木) 07:16:17
boostだと>>17の内容ができないな。
58デフォルトの名無しさん:2006/11/09(木) 16:33:43
なんで?
59デフォルトの名無しさん:2006/11/09(木) 17:10:32
boost::token_iterator<>::base()を使ってもいいならデリミタの変更もできるな。
ドキュメントされていないのが嫌な感じではあるが。
60デフォルトの名無しさん:2006/12/07(木) 01:21:50
文字列区切るだけなら、ポインタを移動していって、目的の文字列を発見したら'\0'に置き換えればいいんじゃないの?
CSVの場合なら、
a = "abc,efg,hij,klm,n\0"な文字列を
a = "abc\0efg\0hij\0klm\0n\0"にするだけの話だろ?
変換過程で、変換した数を保持してやって、それぞれの文字列にアクセスするのは、
b = a
for( int i = 0 ; i<=(目的のトークン) ; i++ )
{
b = b + lstrlen( b ) + 1;
}
でアクセスできるじゃん
61デフォルトの名無しさん:2006/12/07(木) 07:01:14
>>60
誰もそんなこと聞いてネェよw
>>8の内容はboostの何使っても微妙なところで引っかかってできない。
繰り返しいうけど微妙なところで引っかかるの。
脳内だけでできると思わないほうがいい。
62デフォルトの名無しさん:2006/12/07(木) 07:52:13
そういっておきながらどこが微妙なのかについては具体的に触れないのなw
63デフォルトの名無しさん:2006/12/07(木) 12:40:52
>>61
a = "abc,efg,\"h,i\nj\",klm,n\0"を
a = "abc\0efg\0\"h,i\nj\"\0klm\0n\0"って事?

split( 変換する文字列, 区切り文字, 例外文字, 英数大文字小文字を区別するか )
見たいな関数を作って、例外文字から例外文字の間は変換作業を中止すればいいんじゃないの?

まあ、こうなってくると面倒くさくなるから、おいらなら、
split( 変換する文字列, 区切り文字列, 英数大文字小文字を区別するか )
にしておいて、読み込むデータをエクセルなんかで、","から"\t"に区切りを変更するけどね
64デフォルトの名無しさん:2006/12/07(木) 22:02:52
【C++】splitメソッドを作って文字列を分割してみよう。【STL】
ttp://goodjob.boy.jp/chirashinoura/detail/id/100.html
65デフォルトの名無しさん:2006/12/08(金) 00:33:43
>>62
俺のやり方だと途中で中断してまた再開するってのができねぇ。
66デフォルトの名無しさん:2006/12/08(金) 00:39:16
>>62
そもそも中断っていってもどこで中断すればいいのか検討がつかない。
中断する位置によってはかなり変な動作をすることになるし。
この辺は実装するにあたっていい具合の仕様が見付からない。

また、指定された文字に閉じられた箇所はデリミタ無しってのが
一括で区切り文字を抜くことができなくてちょっと難しい。
そもそも、デリミタを途中でチェンジできる仕様みたいだから一括は全部駄目だけど。
中断する条件によってこの辺はかなり難しくなると思う。
67デフォルトの名無しさん:2006/12/08(金) 00:43:11
boostのtokenizerを素直に使えば要素一つ読む毎に制御が戻るが、
それじゃだめなのか?
68デフォルトの名無しさん:2006/12/08(金) 00:49:39
>>67
それってデリミタのチェンジいけんの?
69デフォルトの名無しさん:2006/12/08(金) 00:56:30
すまんが「俺のやり方だと」だけじゃどこが問題なのか分らん。
俺のやり方だと出来るとしか言いようがない。

boost::tokenizerならtoken_iterator使うだけで1,2,5はできるだろ。
>>8の3と4は関数オブジェクトを適当に書いてfilter_iteratorでtokenizerに渡せば解決。
70デフォルトの名無しさん:2006/12/08(金) 01:01:18
デリミタを途中で替えたいなら、tokenizerを使わずにTokenizerFunctionを
直接使えばなんとかなるはず。

…と思ったがescaped_list_separatorには外部からアクセスできない内部状態があるな。
「最後の要素が空でない」という条件下ではうまくいくけど、一般的には無理っぽい。
71デフォルトの名無しさん:2006/12/08(金) 01:03:27
>>69
それってそれぞれを別々にやる場合だけじゃない?
例えば中断したときにデリミタをチェンジして再開とかできんの?
あと、トークン3つめまではデリミタXX、その先の処理は、
文字列XXと○○で囲まれた文字へのデリミタ■■の適用を除外し、
枠外はデリミタ△△、■■でトークンを取得・・・とか。
7270:2006/12/08(金) 01:05:12
いや、文字列の最後を明示的にテストすればいいのか。
泥臭いけど、できないことはないということで。
73デフォルトの名無しさん:2006/12/08(金) 01:24:31
>>71
>>59の通り、token_iterator<>::base()で元のイテレータ型で現在位置を示すイテレータが手に入るから、
別のtokenizerを作ってやるなりtokenizer::asign呼ぶなりで途中からの変更が可能。
74デフォルトの名無しさん:2006/12/08(金) 01:25:25
typo。疲れてるな。寝よう。
-asign
+assign
75デフォルトの名無しさん: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"にすればいいんじゃないのか?
76デフォルトの名無しさん: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)
77デフォルトの名無しさん:2006/12/09(土) 01:54:39
それは字句解析。tokenizerの仕事じゃないよ。
boost::spiritでも使いなされ。
78デフォルトの名無しさん:2006/12/09(土) 05:25:22
>>76
なんか、>>1で言ってるのと全然違うもんじゃないですか...
そう言う形でと言うのなら、検索の仕方から全然違う物になると思いますよ
単純に、","であるとか"\r\n"であるとか、"<BR>"であるとかを句切り符号にして区切るようなルーチンであれば、対象の先頭から何も考えず調べればいいけれど

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

for(i=0;i<size;i++){unko("うんこ?\"Yes/No\"");}
この場合だと、
'(' ')' ';' '<' '+' '{' '}'
と一致する文字を探すルーチンを作る方が簡単ではないでしょうか?
この場合、単純な1文字の検索なんで、検索の工夫といっても限られるとは思いますが...
79デフォルトの名無しさん: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\"" ) ; }

ここまでもってこれちゃうからこの辺の幅を捨てるのは惜しいと思うんだよね。
80デフォルトの名無しさん:2006/12/10(日) 01:16:11
spiritが大げさだというならregexはどうだ?
81デフォルトの名無しさん:2006/12/14(木) 16:40:35
(っ´▽`)っ上げ
82デフォルトの名無しさん:2006/12/26(火) 02:47:06
一年も経つのに、まだできてないの?
というか、作るスキルないから、boost流用って流れになってるのか?
83デフォルトの名無しさん:2006/12/26(火) 14:30:33
xpressiveのtoken_iteratorでいいじゃない
84デフォルトの名無しさん
>>81 カワイイ