X



C++相談室 part157
レス数が1000を超えています。これ以上書き込みはできません。
0954デフォルトの名無しさん
垢版 |
2021/11/13(土) 11:44:37.82ID:wZp5djKL
vectorもそうだけど、倍々にメモリを再配置していくアルゴリズムがそこそこ効率的なので、
たいていの場合はreserveしようがしまいが有意な差は出ないよね
0955デフォルトの名無しさん
垢版 |
2021/11/13(土) 12:34:40.00ID:GR8tTV2x
>>943
ほんそれ
std::codecvt_utf8_utf16とか黒歴史でしかない
0956デフォルトの名無しさん
垢版 |
2021/11/13(土) 12:36:34.59ID:GR8tTV2x
>>944-945
良い子は真似をしないように
0957デフォルトの名無しさん
垢版 |
2021/11/13(土) 12:49:12.18ID:jQtDYU1M
プログラミングとしてはiso2020使ってた頃と大して変わらんよね
低レベルで吸収してくれんとやってられん
0958デフォルトの名無しさん
垢版 |
2021/11/13(土) 13:24:23.81ID:xg91cK1y
ファイル読み取りもシステムコール側が独自にバッファリングしていることが多いから
プログラマ側ががんばってバッファリングしても二度手間だったりする
0959ハノン ◆QZaw55cn4c
垢版 |
2021/11/13(土) 15:53:45.28ID:DyUYxUU0
>>955
utf32<->utf8
utf32<->utf16
で十分だと思っていますが

というか、 utf16 自体が黒歴史…
0961デフォルトの名無しさん
垢版 |
2021/11/13(土) 17:16:26.07ID:kpA91CRo
文字コードなんて事実上iconvが標準だろ
せいぜいicuくらい
他は一部のプラットフォーム固有の関数くらい
制御コードはISO2022でもなければ使わんし、いうてwhite spaceの類は使われてないから気にすんな
真面目にやると文字の境界見つけんのがだるいし、合成文字の扱いも微妙、異常系の仕様も要件次第になるし、Unicodeのバージョンも無限に上がりそうだけどなw
ってわけでC++とか関係ない話だからどうでもいいよ
0966デフォルトの名無しさん
垢版 |
2021/11/13(土) 21:14:20.03ID:aIrFEHKz
自分はHTML5の仕様に従って変換してます!
0967デフォルトの名無しさん
垢版 |
2021/11/14(日) 08:24:14.02ID:gLhea8X6
>>959
結合文字列があるから、結局コードポイントに必ず1文字が対応しているとは限らないし、
何使ってもUnicodeは闇じゃないか。
まあ、UTF32使えばコードポイントがぶっ壊れることは避けられるけれども。
0968デフォルトの名無しさん
垢版 |
2021/11/14(日) 09:14:46.42ID:ybz8bu8o
この場合同じコードポイントでの変換なわけだし一文字がどうとか関係ないが。
0969デフォルトの名無しさん
垢版 |
2021/11/14(日) 10:38:12.94ID:G9ajtZXw
>>948
Perl/Ruby/JSなんかで正規表現を使って置換する場合でも、
同じようなアルゴリズムを使ってるはずだから、これが
特に非効率なわけではないし、代わりになるアルゴリズムで
これよりトータルで効率の良いものも恐らく存在しない。

1.例えば、0x0aと0x09の出現回数を最初に数えれば、必要な
 dstのバイト数を見積もることは可能だが、その場合は、
 二回もパースが必要になるし、プログラムも分かりにくくなる。
 二回パースすることによる速度低下も有る。

2.dstのサイズはsrcのサイズの2倍を越えないので、単純に
 dstの内部バッファをsrcのバイト数の2倍として予約しておけば
 メモリ確保は一回で済むが、srcが巨大な時、メモリを圧迫し、
 余り良いアルゴリズムとは言えない。
0970デフォルトの名無しさん
垢版 |
2021/11/14(日) 10:52:13.79ID:G9ajtZXw
>>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の値は大体で書いたので、厳密には少し違うだろう。
0971デフォルトの名無しさん
垢版 |
2021/11/14(日) 10:59:39.62ID:G9ajtZXw
>>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 - 公比 )
を用いた。
0972デフォルトの名無しさん
垢版 |
2021/11/14(日) 11:04:20.53ID:G9ajtZXw
>>971
誤: 等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 )
正: 等比数列の和 = 初項 * ( 1 - 公比^項数) / ( 1 - 公比 )
0973デフォルトの名無しさん
垢版 |
2021/11/14(日) 12:08:34.21ID:p964tW2k
俺は数年前業を煮やして自前のstringクラスを作ってしまった(´・ω・`)
・sjis/utf8/utf16/utf32対応で比較・代入などどの組み合わせでも問題なく動く
・どの文字コードでも同じハッシュ値を生成する
・char型がsjisなのかutf8なのかはdefineで決める
・テンプレートベースのformatを用意してprintfを置き換え
みたいな
0976デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:30:12.63ID:mwYTHPjW
えー
コンストラクタで各種文字コードのバイト列を受け取れるようにして内部保持形式はUTF32でよくない?
0977デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:42:53.43ID:p964tW2k
それだと大きめのテキストファイルを開いたときなどいちいち変換が入って遅くなりそうだから…といっても実際にはどっちが効率良いのかまでは比べてないけど
異なる文字コード同士比較する時なんかはコードポイント単位で読み出して結局utf32ベースで処理するしな…
0978デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:44:30.36ID:E00roTgy
>dstのサイズはsrcのサイズの2倍を越えない

しね
0979デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:59:19.66ID:5aeLrxCA
プログラマーは3種類しかいない
文字コードが分からない一般プログラマー
文字コードを理解したと勘違いしている地雷プログラマー
そして人類が文字コードを理解するのは不可能だと悟った上でなんとか事故が起こらないように心を砕く真の専門家だ
0980デフォルトの名無しさん
垢版 |
2021/11/14(日) 14:17:19.40ID:p964tW2k
>>976
あーあとは、これのstring_viewバージョンがあって、関数のパラメータをconst mystring_view& strみたいに受けると、どんな対応してる文字なら(リテラルや対応してるクラス含めて)なんでも参照として受け付けるから便利なんだよね
0982デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:13:11.67ID:p964tW2k
実質的にはほとんどなにも変わらないと思うけど、無駄なコピーが減る場合もあるので付けておくに越したことはないと思う
0983デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:45:24.64ID:p964tW2k
まぁ、でも参照もコストゼロってわけじゃないから、場合によっては遅くなることもあるか…
0986はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/14(日) 17:38:21.62ID:A4GQ1/1N
参照で受け取るときには const を付けないと右辺値を受け取れないんだよ。

&& にしたら逆に右辺値しか受け取れないし、
テンプレートにするのも面倒くさいし、
const 参照で不都合がないならまずそれを選ぶのが常道になってる。

積極的にそうする必要はなくても手癖でやるよね。
0987はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/14(日) 17:44:17.95ID:A4GQ1/1N
>>985
const 無しから const 付きの参照へは暗黙の型変換が許されるがその逆はない。
const 付きにしたらそれがずっと伝わっていくってことだ。

元のオブジェクトが const でないなら const_cast で const を剥がして書き換えるのは一応は有りなはずだが、
かなり行儀が悪いしな。
0989デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:02:00.71ID:nLCz7RQY
責任ベースのconstは有り得るのでは?
privateが在るんだから。
0990デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:05:38.66ID:leu9kbhs
というか伝播しなかったら困るのでは?
お行儀悪くconst_castしない前提なら
ある関数の引数がconstだったら、その関数が呼び出す関数もまたconstであるという保証は大切だろうし
0991デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:45:07.42ID:nLCz7RQY
もちろんそれは大切ですよ。
伝搬しなかったら意味ないし。
0992ハノン ◆QZaw55cn4c
垢版 |
2021/11/14(日) 19:45:46.13ID:5CSGBVhH
K&R2 にも const はありますが全然使わなかったなあ…volatile 同様キワモノだとおもっていました(爆)
0993デフォルトの名無しさん
垢版 |
2021/11/14(日) 22:33:34.47ID:oUoND4t/
C++20からコルーチン入るけどコルーチンの返り値に関数内の変数の参照返すの問題になるかな?

hoge& test(){
hoge tmp;
for(int i=0;i<10;++i){
co_yield tmp;
}
}

//返り値は実際はgeneratorとかになるかもしれない
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 98日 5時間 44分 33秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況