- 1 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 10:57:31.60 ID:JaaB5Egp.net]
- 前スレ
C++相談室 part156 https://mevius.5ch.net/test/read.cgi/tech/1621389313/
- 970 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 23:33:56.40 ID:qmhW9zZv.net]
- >>945
[補足] このプログラムは、1バイトずつ読み取っているが、文字符合は、このままでも、 無修正で ASCIIだけでなく、SJISやUTF8やEUCにも対応している。 後者のような符合では、例えば、SJISの"あ"の文字だと、1文字単位ではなく、 1バイトずつ処理され、2回ループが回るが、問題ない。 UTF8だと3回ループされる。 つまり、このプログラムでは、SJISの1文字は、2文字のように UTF8の"あ"の文字は、3文字のように処理される。 しかし、それでも結果的には問題ない。 なぜなら、0x0aや0x09は、多バイト文字の中には含まれてないから。 ただし、SJISの場合、\ の文字コードが含まれているので注意が必要ではあるが、 今回は問題ない。
- 971 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 23:39:04.51 ID:qmhW9zZv.net]
- >>946
[補足2] char は、C言語が登場した時には、「文字」の意味であったが、 今は少なくとも C言語では文字の意味はほぼなく、1バイト(8BIT)の意味である。 そして、C言語でcharが1バイト(8BIT)で無い処理系は、主流ではないので無視 してよい。 Javaなどでは、charが 必ず16BITであるのとは対照的である。 ただし、Javaもサロゲートペアの文字に対しては、charは文字の一部であって 本当の1文字には対応していない。 ※結局、どの言語も、1文字を固定長で扱い続けることは避けている。
- 972 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 02:30:33.64 ID:sxA0duhG.net]
- メモリ確保が多発しそうなプログラムやね
- 973 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 06:30:48.47 ID:x1CN7sQN.net]
- 老害が一生懸命考えたんだろw
メモリリークしまくられるよりマシ
- 974 名前:デフォルトの名無しさん [2021/11/13(土) 07:45:14.90 ID:xg91cK1y.net]
- CStringにせよbasic_stringにせよメモリ確保の多発なんて心配しなくていいよ
JavaのStringじゃないんだから
- 975 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 08:44:09.90 ID:sxA0duhG.net]
- こういう時reserveしてなくても問題ないの?
最大容量わかってるやん。
- 976 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 09:34:35.76 ID:GqP7nzeW.net]
- メモリ2倍取るのと再配置とどっちが無駄かはそれこそ環境と目的次第だろ
- 977 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 11:06:02.43 ID:wYZH/w0f.net]
- >>945
CStringA もしくは _T("\\t")他
- 978 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 11:44:37.82 ID:wZp5djKL.net]
- vectorもそうだけど、倍々にメモリを再配置していくアルゴリズムがそこそこ効率的なので、
たいていの場合はreserveしようがしまいが有意な差は出ないよね
- 979 名前:デフォルトの名無しさん [2021/11/13(土) 12:34:40.00 ID:GR8tTV2x.net]
- >>943
ほんそれ std::codecvt_utf8_utf16とか黒歴史でしかない
- 980 名前:デフォルトの名無しさん [2021/11/13(土) 12:36:34.59 ID:GR8tTV2x.net]
- >>944-945
良い子は真似をしないように
- 981 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 12:49:12.18 ID:jQtDYU1M.net]
- プログラミングとしてはiso2020使ってた頃と大して変わらんよね
低レベルで吸収してくれんとやってられん
- 982 名前:デフォルトの名無しさん [2021/11/13(土) 13:24:23.81 ID:xg91cK1y.net]
- ファイル読み取りもシステムコール側が独自にバッファリングしていることが多いから
プログラマ側ががんばってバッファリングしても二度手間だったりする
- 983 名前:ハノン mailto:sage [2021/11/13(土) 15:53:45.28 ID:DyUYxUU0.net]
- >>955
utf32<->utf8 utf32<->utf16 で十分だと思っていますが というか、 utf16 自体が黒歴史…
- 984 名前:ハノン mailto:sage [2021/11/13(土) 15:54:13.83 ID:DyUYxUU0.net]
- >>958
stdio.h をディするのはそこまでだ
- 985 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 17:16:26.07 ID:kpA91CRo.net]
- 文字コードなんて事実上iconvが標準だろ
せいぜいicuくらい 他は一部のプラットフォーム固有の関数くらい 制御コードはISO2022でもなければ使わんし、いうてwhite spaceの類は使われてないから気にすんな 真面目にやると文字の境界見つけんのがだるいし、合成文字の扱いも微妙、異常系の仕様も要件次第になるし、Unicodeのバージョンも無限に上がりそうだけどなw ってわけでC++とか関係ない話だからどうでもいいよ
- 986 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 18:02:09.89 ID:vJfZgOKN.net]
- C++ なら strstream やろ
- 987 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 18:03:36.59 ID:vJfZgOKN.net]
- >>959
utf32<->utf8 utf32<->utf16 どちらも std:: のは黒歴史
- 988 名前:ハノン mailto:sage [2021/11/13(土) 18:39:04.73 ID:DyUYxUU0.net]
- >>963
そうなんですか… なぜなんですか?
- 989 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 19:29:59.64 ID:vJfZgOKN.net]
- >>964
知ってるくせに https://cpprefjp.github.io/reference/codecvt.html https://cpprefjp.github.io/reference/codecvt/codecvt_utf8.html https://cpprefjp.github.io/reference/codecvt/codecvt_mode.html https://cpprefjp.github.io/reference/locale/wstring_convert.html
- 990 名前:デフォルトの名無しさん [2021/11/13(土) 21:14:20.03 ID:aIrFEHKz.net]
- 自分はHTML5の仕様に従って変換してます!
- 991 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 08:24:14.02 ID:gLhea8X6.net]
- >>959
結合文字列があるから、結局コードポイントに必ず1文字が対応しているとは限らないし、 何使ってもUnicodeは闇じゃないか。 まあ、UTF32使えばコードポイントがぶっ壊れることは避けられるけれども。
- 992 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 09:14:46.42 ID:ybz8bu8o.net]
- この場合同じコードポイントでの変換なわけだし一文字がどうとか関係ないが。
- 993 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 10:38:12.94 ID:G9ajtZXw.net]
- >>948
Perl/Ruby/JSなんかで正規表現を使って置換する場合でも、 同じようなアルゴリズムを使ってるはずだから、これが 特に非効率なわけではないし、代わりになるアルゴリズムで これよりトータルで効率の良いものも恐らく存在しない。 1.例えば、0x0aと0x09の出現回数を最初に数えれば、必要な dstのバイト数を見積もることは可能だが、その場合は、 二回もパースが必要になるし、プログラムも分かりにくくなる。 二回パースすることによる速度低下も有る。 2.dstのサイズはsrcのサイズの2倍を越えないので、単純に dstの内部バッファをsrcのバイト数の2倍として予約しておけば メモリ確保は一回で済むが、srcが巨大な時、メモリを圧迫し、 余り良いアルゴリズムとは言えない。
- 994 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 10:52:13.79 ID:G9ajtZXw.net]
- >>951
文字列のバッファは、不足すると2倍、2倍、・・・で確保されていくので 確保される回数は、最終的な文字列のバイト数を N としたとき、大体、 log2(N) 回程度となり、バッファがコピーされるトータルのバイト数は、 b = a + a*2 + a*2^2 + a* 2^3 + ... + a* 2^k k = log2(N) 程度 a = 文字列クラスの内部バッファの初期バイト数。 となり、大体で言えば、2N を越えない。 1 + 2 + 2^2 + 2^3 + ... + 2^k は 2進数で考えれば、全てのビットが 1 に成っている整数で、 2^{k+1} = 2*2^k = 2*2^{log2(N)} = 2 * N であることに注意する。 ただし、bの値は大体で書いたので、厳密には少し違うだろう。
- 995 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 10:59:39.62 ID:G9ajtZXw.net]
- >>970
1 + 2 + 2^2 + 2^3 + ... + 2^k = Σ_{i=0}^k 2^i = (1 - 2^{k+1}) / (1 - 2) = 2^{k+1} - 1 である。途中、等比数列の和の公式: 等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 ) を用いた。
- 996 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 11:04:20.53 ID:G9ajtZXw.net]
- >>971
誤: 等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 ) 正: 等比数列の和 = 初項 * ( 1 - 公比^項数) / ( 1 - 公比 )
- 997 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 12:08:34.21 ID:p964tW2k.net]
- 俺は数年前業を煮やして自前のstringクラスを作ってしまった(´・ω・`)
・sjis/utf8/utf16/utf32対応で比較・代入などどの組み合わせでも問題なく動く ・どの文字コードでも同じハッシュ値を生成する ・char型がsjisなのかutf8なのかはdefineで決める ・テンプレートベースのformatを用意してprintfを置き換え みたいな
- 998 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 12:57:01.80 ID:hL5WeBkj.net]
- >>973
保持するときのエンコードは?
- 999 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 12:58:38.01 ID:p964tW2k.net]
- >>974
文字コードの種類に1バイト用意して、後はそれぞれの文字コードで直接保存している
- 1000 名前:デフォルトの名無しさん [2021/11/14(日) 13:30:12.63 ID:mwYTHPjW.net]
- えー
コンストラクタで各種文字コードのバイト列を受け取れるようにして内部保持形式はUTF32でよくない?
- 1001 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 13:42:53.43 ID:p964tW2k.net]
- それだと大きめのテキストファイルを開いたときなどいちいち変換が入って遅くなりそうだから…といっても実際にはどっちが効率良いのかまでは比べてないけど
異なる文字コード同士比較する時なんかはコードポイント単位で読み出して結局utf32ベースで処理するしな…
- 1002 名前:デフォルトの名無しさん [2021/11/14(日) 13:44:30.36 ID:E00roTgy.net]
- >dstのサイズはsrcのサイズの2倍を越えない
しね
- 1003 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 13:59:19.66 ID:5aeLrxCA.net]
- プログラマーは3種類しかいない
文字コードが分からない一般プログラマー 文字コードを理解したと勘違いしている地雷プログラマー そして人類が文字コードを理解するのは不可能だと悟った上でなんとか事故が起こらないように心を砕く真の専門家だ
- 1004 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 14:17:19.40 ID:p964tW2k.net]
- >>976
あーあとは、これのstring_viewバージョンがあって、関数のパラメータをconst mystring_view& strみたいに受けると、どんな対応してる文字なら(リテラルや対応してるクラス含めて)なんでも参照として受け付けるから便利なんだよね
- 1005 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 14:59:21.42 ID:WpZMPVn+.net]
- それconst&いるんか?
- 1006 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 15:13:11.67 ID:p964tW2k.net]
- 実質的にはほとんどなにも変わらないと思うけど、無駄なコピーが減る場合もあるので付けておくに越したことはないと思う
- 1007 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 15:45:24.64 ID:p964tW2k.net]
- まぁ、でも参照もコストゼロってわけじゃないから、場合によっては遅くなることもあるか…
- 1008 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 16:54:05.80 ID:tkHjD9h1.net]
- const って伝播するから嫌い
付けるのは反対ではないが
- 1009 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 17:26:15.73 ID:CXUBNW9m.net]
- 伝播ってどういうこと?
- 1010 名前:はちみつ餃子 mailto:sage [2021/11/14(日) 17:38:21.62 ID:A4GQ1/1N.net]
- 参照で受け取るときには const を付けないと右辺値を受け取れないんだよ。
&& にしたら逆に右辺値しか受け取れないし、 テンプレートにするのも面倒くさいし、 const 参照で不都合がないならまずそれを選ぶのが常道になってる。 積極的にそうする必要はなくても手癖でやるよね。
- 1011 名前:はちみつ餃子 mailto:sage [2021/11/14(日) 17:44:17.95 ID:A4GQ1/1N.net]
- >>985
const 無しから const 付きの参照へは暗黙の型変換が許されるがその逆はない。 const 付きにしたらそれがずっと伝わっていくってことだ。 元のオブジェクトが const でないなら const_cast で const を剥がして書き換えるのは一応は有りなはずだが、 かなり行儀が悪いしな。
- 1012 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 17:59:13.06 ID:CXUBNW9m.net]
- スコープ限定のconstを欲するひとがいるとは思わんかった
- 1013 名前:デフォルトの名無しさん [2021/11/14(日) 18:02:00.71 ID:nLCz7RQY.net]
- 責任ベースのconstは有り得るのでは?
privateが在るんだから。
- 1014 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 18:05:38.66 ID:leu9kbhs.net]
- というか伝播しなかったら困るのでは?
お行儀悪くconst_castしない前提なら ある関数の引数がconstだったら、その関数が呼び出す関数もまたconstであるという保証は大切だろうし
- 1015 名前:デフォルトの名無しさん [2021/11/14(日) 18:45:07.42 ID:nLCz7RQY.net]
- もちろんそれは大切ですよ。
伝搬しなかったら意味ないし。
- 1016 名前:ハノン mailto:sage [2021/11/14(日) 19:45:46.13 ID:5CSGBVhH.net]
- K&R2 にも const はありますが全然使わなかったなあ…volatile 同様キワモノだとおもっていました(爆)
- 1017 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 22:33:34.47 ID:oUoND4t/.net]
- C++20からコルーチン入るけどコルーチンの返り値に関数内の変数の参照返すの問題になるかな?
hoge& test(){ hoge tmp; for(int i=0;i<10;++i){ co_yield tmp; } } //返り値は実際はgeneratorとかになるかもしれない
- 1018 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 22:35:39.21 ID:PetPaRNq.net]
- yeild使えるようになるのか
- 1019 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 01:03:02.10 ID:tPLK0GqY.net]
- viewは値渡しが基本だよ
- 1020 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 06:05:50.61 ID:Rt8JG1Np.net]
- 何かのリミッタが外れた感じだね
無差別にぶち込むようになった
- 1021 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 06:11:48.42 ID:Rt8JG1Np.net]
- 江添が逃げた理由も察しがつく
- 1022 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 15:55:33.66 ID:Ux5WoKB6.net]
- 更新してないよね
- 1023 名前:デフォルトの名無しさん mailto:hage [2021/11/15(月) 16:41:30.12 ID:i/3H6iLT.net]
- hage
- 1024 名前:デフォルトの名無しさん mailto:pow(10,3); [2021/11/15(月) 16:42:03.92 ID:i/3H6iLT.net]
- 10^3
- 1025 名前:1001 [Over 1000 Thread.net]
- このスレッドは1000を超えました。
新しいスレッドを立ててください。 life time: 98日 5時間 44分 33秒
- 1026 名前:過去ログ ★ [[過去ログ]]
- ■ このスレッドは過去ログ倉庫に格納されています
|

|