1 名前:858 [2007/12/24(月) 03:41:59 ] C++標準ライブラリの一つ、STLについて。 前スレ 【C++】STL(Standard Template Library)相談室 7 pc11.2ch.net/test/read.cgi/tech/1185986999/ 過去ログ・リンク・書籍紹介は >>2 以降
330 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:12:03 ] 結局ランダムアクセス用の冗長なデータを込みにしたクラスにしないとどうしようもないし、 パフォーマンス上そこまで標準に組み込まれることは無いだろう。 まあ、それ用のクラスを string 系列とは別に作ることは可能だろうが、 SJIS とかはまあ無理だな。
331 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:12:42 ] length(L"final")が5と帰ってきてくれたら、なにか嬉しい?
332 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:14:25 ] wstringのfind,insert,appendとかはサロゲートも平気そうな気がするけど なんとも微妙。。 文字とか文字数を意識した扱いをしようとしない限りは平気なのかな・・?
333 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:15:23 ] 文字数を指定しての置換とかはやばそうだな。
334 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:16:12 ] 非常によく使うデータ構造だから、効率を犠牲にして理想に走れないもどかしさ
335 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:16:41 ] findは大丈夫そうだけど、insert/appendは、サロゲートの前半だけ+別の文字、 みたいな不正な文字列を受け付けるべきか、みたいな話はあるよね。
336 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:17:18 ] 英語圏だとマルチバイトうぜーとかしか思われてないだろうしな。
337 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:18:12 ] stdc++のレベルで理想に走らなくても良いよ。というか理想がなんなのかも分からないし。この話題はこっち向きじゃないかい。 C++で新しい文字列クラスをつくろう 2 pc11.2ch.net/test/read.cgi/tech/1167132255/
338 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:20:06 ] 普通insertする文字とかiteratorもfindの結果のiteratorとかなわけで 問題なくね? >>333 確かに文字数指定でサロゲート文字の途中とかになってたら文字が切れちゃう よねぇ
339 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:21:08 ] もうこういうのは boost の領分かもしれないな。
340 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:21:41 ] がしがし書き換えたいならutf32に変換してから、書き換えて、utf8なりutf16なりに戻すほうが簡単そうだ。
341 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:24:29 ] 結局、find/appendなどの引数に与える文字が文字の途中などでない、 と文字数指定の関数に文字の途中などの数を指定しない を守ってればサロゲートもおけ、でいいのかな?
342 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:26:18 ] まぁあと15年位したら皆UTF-32でのんびりやってるさ
343 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:26:48 ] >>341 それを守るためにどれだけのコストが掛かるかって話してるんじゃないのか
344 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:27:16 ] >文字数指定の関数に文字の途中などの数を指定しない これを守るのがすげー大変そうだ。
345 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:27:59 ] まだSJISが使われてると思います><
346 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:28:55 ] SJIS 専用のクラスならまあ作れるだろうな。
347 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:29:01 ] 俺頭から5文字取るみたいなコードとりかえしがつかないくらい書いてるな
348 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:32:47 ] >>341 文字数ならサロゲートを割ってしまうことはないよ。 サロゲートペア一組で一文字だから。
349 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:33:58 ] wchar五個分でなくて、5「文字」分きちんと取れるコードを?
350 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:35:13 ] たとえば、 「か゛」は1文字という扱いでいいのか? 「か゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛(略」 みたいなどうしようもない連中はどうしよう?
351 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:38:26 ] >>348 std::string(wstring)の「文字数指定」は、1文字が固定長のコード体系が前提だから、サロゲがあると壊れるよ。 >>350 それペアになってなくない?
352 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:38:36 ] >>348 >サロゲートペア一組で一文字 一組で4バイト(結合文字は6バイトもある) で、文字数(というより2バイト単位)指定はアウト。 s = サロゲート文字列 s2 = s.substring(0, 5) とかやったらあぼーんでしょ
353 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:42:20 ] >>352 文字数というのは、キャラクタ数という意味で使った。
354 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:47:21 ] CString的にTCHAR使えてさらにクロスなものはないのかね?
355 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:48:52 ] >>350 合成文字は2キャラクタでしょ。 合成文字をぶった切ると、意味は通じなくなるかもしれないが違法ではない。
356 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 02:53:07 ] ああ、その「キャラクタ数」というのは、要するにUTF-32換算なわけか。
357 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 03:00:31 ] Winではstringは使うな。2バイト目が1バイト目とかぶってやがるからな。 wstringはサロゲートに注意して使え。途中で切るなよ。 Win98とかまだやってるカスはCStringでも使ってろ。 LinuxではstringでもEUCとUTF-8は2バイト目が1バイト目とかぶらないからまだ なんとかなるはずだ。 クロスにしたいなら文字列クラスは当然自前だろ? が俺の現状の認識
358 名前:デフォルトの名無しさん [2008/01/27(日) 03:02:31 ] >>327 ハァ?
359 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 03:09:34 ] >>358 へ?
360 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 03:14:40 ] >>357 追加でMac OS XはCFString使っとけ。以上。
361 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:50:39 ] >>357 OS 関係なくてエンコーディングの話だろ? Windows でも UTF-8 使えば問題ないし、 Linux でも Shift_JIS 使えば問題は出る。 クロスにしたければエンコーディングを OS 任せにしなければ良いだけの話。 たとえば UTF-8 を使うと決めれば std::string でもいけるでしょ。
362 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 05:05:46 ] >>361 だけの話・・って、実際にUTF-8でやったことないんだろ?試しにやってみなよ。 APIに渡すとき、コンソルに出すときすべてに変換をかます必要あるだろ? 文字リテラルはどうするんだ?ソース内のUTF-8はまだコンパイラのサポートが微妙だぞ。 現実的じゃないんだよ。OSが正式にサポートしてるSJISとかUTF-16以外を 内部エンコーディングにするのは。
363 名前:デフォルトの名無しさん [2008/01/27(日) 05:33:05 ] 1文字が何バイト使うかはどれ使っても一定ではない どれを使うか決まっていればどれ使ってもよい
364 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 05:48:20 ] UTF-32は4バイト固定。でも合成文字があるので結局同じ問題は残る。
365 名前:デフォルトの名無しさん [2008/01/27(日) 06:53:55 ] 一方ロシアはモールス符号を使った
366 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 06:59:29 ] 合成文字なんて捨てろ すべての文字を表現したいなんて無駄の極み
367 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:26:25 ] おいおい、放棄かよ
368 名前:デフォルトの名無しさん [2008/01/27(日) 08:37:31 ] >>362 入出力と多言語以外の問題はなし 日本語使うんだったらどれでも同じ 入出力にコンバートするのに手間がかかるかどうかだけ
369 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 10:08:29 ] 全部画像でおk
370 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 12:33:49 ] 16x16ピクセル(256ビット)のパターンで全ての文字を表現するとかどっかで見たな。
371 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 13:24:31 ] 文字コード総合スレだと思った つーかPDFでおk
372 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 13:25:37 ] ( д ) ゚ ゚
373 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:15:28 ] >>365 一方ロシアは画像を使った こっちの方がしっくりくるな。
374 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:52:02 ] >>370 宇宙の星にそれぞれ新しい文字で名前つけてもあまるだろw
375 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 16:26:01 ] 一文字32バイトは流石に先取りしすぎだな
376 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 16:37:26 ] string path = "c:\\機能仕様書\\01.doc"; path.find("\\"); こんなであぼーんするstringは危険としか言いようがない
377 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 16:47:52 ] そんなアホなことをする方が悪い。
378 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 16:55:52 ] 1文字に1GB
379 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 16:56:20 ] もう OCR でいいよ・・・
380 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 17:24:37 ] 人間様の認識能力を利用する形が最強
381 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 17:28:05 ] 人間なんてよく読み間違うじゃん
382 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 17:56:59 ] >371 CID(AJ15)のことか? あのコードも印刷以外に使うのは 結構アレなんだけどなー。
383 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:00:16 ] C++ メンバ関数内で スコープ解決演算子で classname::メンバ変数 の値変更するのと this->メンバ変数 の値変更するのは何が違うの?
384 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:04:56 ] struct P{int m;}; struct C : public P{ int m; void f(){ this->m = 0; this->P::m = 1; } }; みたいな話。
385 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:07:20 ] >>377 findが使えないstringって・・・カスめ
386 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:09:21 ] path[path.find("\\")] == '\\'になるじゃん、ちゃんと。
387 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:12:41 ] 返答ありがとう。 最初の this->m は C のオブジェクトのメンバ変数m this->P::m は何でしょうか?
388 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:14:13 ] >>386 まじか?
389 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:16:16 ] >>386 そりゃなるだろwww
390 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:16:42 ] >>387 P の m にきまっちょるだろう
391 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:22:57 ] >>386 マジレスすると「能」の2バイト目の「\」がfindで見つかっちゃったんです。 string s = SJISの日本語; はやっちゃだめなんです。初心者はみんなやってしまうんですが。
392 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:23:56 ] >>384 >>390 継承したときに変数名かぶった場合コウ書くんですね。 でも、多重に継承した場合、どう書くんだろう?
393 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:29:12 ] scope
394 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:35:01 ] >>392 間の型へ一旦 this をアップキャストすると良い。
395 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:35:31 ] >>391 だから、find とか使わない分には使っていいんだってばよ。
396 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:35:39 ] あー、ダイヤモンド継承か。 P1::P2::Pb::a = 100; みたいに、継承順を追いかければ指定できたような・・・
397 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:37:14 ] char []hoge = SJIS文字列; とかやって、 strchr( hoge, '\\'); ってまずいじゃん。 でも、「char配列にSJIS文字列入れるの禁止」って言うのはどうよ、みたいな。
398 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:37:36 ] 別の言語の癖が出てるぜ
399 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:37:59 ] >>397 そうそう。そんな感じ。
400 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:42:17 ] 文字コードの話って、荒れる割に全然面白くないし、有用な知見も得られないんだよな。
401 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:44:35 ] 結局毛唐が ASCII 以外どうでもいいと思ってるからな。
402 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:47:46 ] 何も考えずに動いていたCStringがなつかすぃ。。 そういえばなんでがんばってfind禁止のダウングレードのstd::string使ってるん だったっけ? だれかどこでも動くCString作ってぇぇ
403 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:49:03 ] >>393 >>394 >>396 ありがと。 やっぱC++はスゲーや。 Cのシンプルな文法に慣れきったオレには奥が深いぜ。
404 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:49:05 ] ドザは Windows のことしか考えないから困る。
405 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:52:20 ] どこでも動く? どこでもSJIS使うの?
406 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:52:31 ] Linuxとかカスいらねーし
407 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:54:02 ] Mac では SJIS 使わん事も無い。 UTF-8 や EUC も使うが。
408 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:57:06 ] ASCII自体が腐ってるからな。誰だよ、あんなコードにしたのは。
409 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:58:30 ] >>405 いや、できればマクロとかでプラットフォームごととか文字コードとか 切り替えられてさ、当たり前だけどfindとかも問題なく動いちゃうやつ。 CStringみたいに楽に使えて、でもUTF-8とか16とかも平気な感じ。 std::ustringみたいに統一しちゃってさ。boostとかかな。
410 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:59:32 ] findだけの問題ならすぐ解決するけどな。 ただ、SJISのままだと単純サーチにするしかないので効率は悪い。
411 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:01:36 ] >>410 そりゃWinの場合は内部的には_mbsstr呼ぶとかして高速化しる
412 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:01:45 ] wstringに自動変換する const char *n_str();と wstring(char*)を付ければ解決するような気になるけど?
413 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:01:47 ] >>406 普通sunだよな
414 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:05:17 ] Windows なら mbs 系でおkだが、 他の環境だとその手の関数あるんだろうか。
415 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:22:06 ] ついでに質問なのですが、TCHARみたいにstringとwstringを切り分けるにはどう すればよいのでしょうか?以下のようにしておく必要があるのでしょうか? 他にもっといい方法があるのでしょうか? #ifdef UNICODE #define tstring string else #define tstring wstring まだ98でもXPでも動かしたいので・・
416 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:23:31 ] 組み込み型にしてもいい位のデータ構造なのに クロスに作るのが難しいこんな世の中じゃ
417 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:25:51 ] >>415 とりあえず #define よりは typedef のほうがいいだろうな。
418 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:30:39 ] >>415 なにかわからないがよくないことが起こりそうな悪寒
419 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:41:43 ] charとwchar_tも切り替えないと。リテラル使ってるところがあったらそれもマクロで囲まないとね。 …めんどくさいでしょ。
420 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:45:37 ] つまり、C++0xのユーザ定義リテラルの登場を待てと
421 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:51:06 ] >>419 それは TCHAR と _T として既に用意されているだろう。
422 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:53:01 ] >>415 typedef std::basic_string<TCHAR> tstring; >>362 361のようなことを現実にやれるソフトウェアでは、 多言語対応のため、文字列リテラルの大半はソースコードに含まれないとか、 APIはラッパー層があるから変換も余裕とかそういう次元にいると思う。
423 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:52:04 ] 実際文字列リテラルをまったく含まないのはたいへんだぞ〜。 メッセージ的なものはともかくfind(":")的なパース類もすべてfind(COLON)とか にして事前にUTF-8で用意しておかなくちゃいけなくなるし、全WinAPIをラップする のはいよいよ無理だろうに。カレントディレクトリ一つ取るのも GetCurDir(string& s){ TCHAR t[PATH_MAX]; ::GetCurrentDirectory(PATH_MAX, t); #ifdef UNICODE Utf-16からUTF-8に変換 #else SJISからUTF-8に変換 } 的にすべてのラップ関数を用意してあげなきゃいけなくなるし。。
424 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:57:46 ] > find(":") 他に理由がなければ、ASCII分はそのままソースに書いていいと思った。
425 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:59:56 ] そんなわけがないだろ。
426 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:02:52 ] A 系使えば大丈夫。
427 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:34:22 ] せっかくWinがUTF-16なのに内部エンコーディングをUTF-8にして、API呼ぶたびに UTF-8からUTF-16に変換はちょっとやだなあ。 全てのAPIをラップする開発コストに加えて、実行時の変換コストまでかかるし。。 やっぱWinはUTF-16でいきたいね。
428 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:37:11 ] いい加減スレチガイだということに(ry
429 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 09:45:10 ] std::string/wstringは最重要のコンテナだしスレ違いとは思わんが・・ 結局文字コード周りはいまいちなのがわかるだけなんだよなあ。。
430 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 14:04:09 ] 話の流れぶった切って申し訳ないが言わせてくれ。 なんか良スレの悪寒。