C++相談室 part141

レス数が900を超えています。1000を超えると表示できなくなるよ。
2019/02/22(金) 03:07:43.52ID:MgOIx7iK
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/03/27(水) 18:20:39.73ID:fzYgEwLp
>>836>>834
まぁ要素数わかってて末尾に入れてくのはナンセンスやね
速度を気にしない場所ならどうでもいいけど
838デフォルトの名無しさん
垢版 |
2019/03/27(水) 18:39:59.51ID:ZT8Ntgus
よくあの時代にこのような洗練されたライブラリを設計できたものだと思います。
もしかすると宇宙人にもらったのかも。
2019/03/27(水) 20:06:12.42ID:KDFmmUkx
配列の長さチェックのオーバーヘッドとかなんかものすごくデジャブ感のある議論だな。
肯定、否定どちらにしてもマウンティングかましたくなる題材なんかね。
2019/03/27(水) 21:09:05.61ID:p4oEJ8zd
標準コンテナで問題になるのはやっぱりヒープだよ
境界チェックとか仮に無断だとしても一定時間で終わる処理
ヒープ使われると最悪システムコールで負荷変動大きすぎる

ちなみにアロケータは要素数で管理できないから面倒
あとvectorで最初にreserveしても最大長越えないチェックが必要で面倒

でこれらを解決するコンテナがboostにあるのでそれを使う
2019/03/27(水) 21:18:02.40ID:p4oEJ8zd
あと標準ライブラリのリンクリストはそもそもの設計が非効率
(クリーンな設計ではあるが)
素朴なcの実装と比べてかなり差がでる
これも代替がboostにある
2019/03/27(水) 21:25:03.72ID:4bSYNNTL
>>835
末尾追加の話なら、Cでも同じだけコストかかるだろ。
>>840
arrayならstackに積まれる。
2019/03/27(水) 21:31:48.60ID:WdEToVPN
>>820
なんか変じゃないですか?
list や vector のときは要素の「追加」なのに、生配列だけ要素の「代入」と設定するのですか?
list や vector で要素の「追加」を考察するのなら、生配列の場合も要素の「追加」を検討してください
2019/03/27(水) 21:38:22.09ID:p4oEJ8zd
>>842
arrayは固定長
欲しいのは最大長を事前に確定しつつ、その範囲で可変長で使えるvector
という話ね
2019/03/27(水) 21:45:52.93ID:9ko5ghKo
ここのCマスター様は、現在の配列長と挿入インデックスのチェックしてreallocしてなんていう
パフォーマンスの悪い便利さに甘えた処理などしない
堂々とv[N]に無条件代入を行って超高速O(1)追加を実現するのだ
2019/03/27(水) 21:50:08.37ID:X5Tg+wiF
事前のresizeかreserveでええんとちゃう?
2019/03/27(水) 21:51:09.94ID:t38PuBqi
事前に分かるならスタック固定長でいいじゃん
2019/03/27(水) 22:02:47.67ID:gbxz82US
reserve あれば困る事なんてないやろ
2019/03/27(水) 23:54:55.06ID:QPwampGA
一般的には無いよ
局所的な話を持ち出してああだこうだ言ってるのが今
そして何をするつもりかは誰も知らん
2019/03/28(木) 00:42:33.33ID:yLTGLAEP
>>829
要素数がN、データの大きさは4バイト、と仮定した場合の話。
2019/03/28(木) 00:47:43.37ID:yLTGLAEP
>>843
4バイト整数のN要素の配列を仮定しているが、Cの単純な固定長配列だと
4バイト整数はコピーするのが当然。
ところが、Listだと、「追加」するしかない。動的配列である
Vectorも、基本的には「追加」が基本。そうでなければ「動的」と言わない。
2019/03/28(木) 00:53:54.09ID:AOcR4eqo
vector.data()、basic_string.c_str()はCと同じの配列の連続アドレスを保証する数少ないインターフェースでしょ。
2019/03/28(木) 01:07:32.08ID:Csoqrb4z
正直stringがゼロ終端を保証したのはちょっとどうかなと思ってる
いや便利なんだけどさ・・
2019/03/28(木) 01:15:59.09ID:eE4sGejC
>>853
特に不都合無いのだからいいだろう
2019/03/28(木) 01:39:16.25ID:AOcR4eqo
アドレスと一緒にバッファサイズを渡せないAPIが世の中に無数にある。ヌル終端は優しさ。
2019/03/28(木) 03:12:24.24ID:0b3fKrWQ
そもそも printf が
2019/03/28(木) 05:04:36.64ID:fRHhg+J8
>>851
なぜかC言語は固定配列でC++だと動的が基本らしい
前提違うのに速度ガーとか言われてもなぁw
2019/03/28(木) 05:12:10.50ID:3LZYwZb1
>>855
ヌル文字をデータとして扱えない、という決定的なウィークポイントが発生しますね…
昔、ツールがヌル文字を扱えない、という点が後から発覚してとても困った経験があります
2019/03/28(木) 07:13:39.49ID:mfvsZ6Gk
>>851
ようゴCマスター様
マスター様は知らなくてビックリするけど、C++ではvectorやlistは要素数が実行時に決まるときに使うんだ
そして驚くべきことに、Cにも要素数が実行時に決まるときに使うための愚かしい機能がなぜか備わってるんだ
reallocっていうらしいんだけどさ
使うときは確保済みのバッファの長さをいちいち調べて、足りなかったら再確保して必要に応じて要素を全部コピーするらしいっすよ
もちろんそんな馬鹿げたオーバーヘッドを払う奴はC++かぶれのド素人だけだけどな
真のCプログラマは一度確保した配列の自由なインデックスにコピーすることでvectorの無意味なオーバーヘッドを回避し超高速O(1)を実現するのだ
2019/03/28(木) 08:00:11.54ID:PaLXcDGr
なんかツッコもうと思ったら既に>>813に書いてあった
2019/03/28(木) 10:11:22.12ID:yLTGLAEP
>>857
C++の配列は固定長が基本。
STLやboostは、C++とは異なる。
2019/03/28(木) 11:32:51.21ID:yLTGLAEP
>>859
>そして驚くべきことに、Cにも要素数が実行時に決まるときに使うための愚かしい機能がなぜか備わってるんだ
>reallocっていうらしいんだけどさ

Cでは、realloc は推奨されて無い。
Cで、要素数が実行時に決まるような集合を扱いたい場合は、自前で
ポインタでリンクする、リンクリストを使う。
毎回それをやると間違いやすいので、賢い人は、自前でリストライブラリを作って
それを用いて操作する。
2019/03/28(木) 11:39:08.71ID:dMtNAb9A
Linuxのソースなんだけど
close(0) close(1) close(2)って書いてあるの見つけたのだが
これってなんの効果が期待できるの?
ファイルディスクリプタ?だと思っていてオープン等をした値番号だと思ってたけど、0 1 2に該当するのがなんなのかと
2019/03/28(木) 12:01:08.00ID:5UOqavsG
stdin, stdout, stderr
865デフォルトの名無しさん
垢版 |
2019/03/28(木) 12:18:22.29ID:des+yyG9
iteratorでstartとendの中に納まってることが保証されてるのに
各要素にアクセスするときにまた範囲チェックとかあると無駄やん
そりゃ書こうと思えばいくらでも危険なコードは書けるけど
安全なときはそういうの省いて高速化出来るのがCの良いところなのに
(レジスタの値が知らない間に壊れても正常に動くようにとか言ってるなら知らん)
2019/03/28(木) 12:31:30.80ID:yd30y0n6
>>861
固定とか決めつけてるのを別にしても何を言いたいのかさっぱりわからん
2019/03/28(木) 12:34:41.89ID:OvbnMtjj
>>862
で、そのオレオレ車輪の再発明クソライブラリは
std::vectorやstd::listより何が優れてるの?
範囲チェックしないから高速wなの?
2019/03/28(木) 12:45:22.23ID:yiBU3VRL
差異があるとすれば、deep copyだね
決めつけ良くない
2019/03/28(木) 12:48:36.64ID:ADAikd1k
>>862
ランタイムでサイズが決まる動的配列にリンクリスト使うのはさすがにダメすぎる
2019/03/28(木) 12:56:24.56ID:TvMamSuP
>>863
デーモンになりたいんだろうな
2019/03/28(木) 13:00:41.99ID:yLTGLAEP
>>869
そもそも、C で出来ないことは、コンピュータのアーキテクチャ上、ほぼ
絶対に出来ない事。
だから、Vectorが、効率面でCを上回ることは絶対に有り得ない。
2019/03/28(木) 13:05:17.92ID:AOcR4eqo
>>869,871
ソートはどうなの? (・∀・)ニヤニヤ
2019/03/28(木) 13:06:22.45ID:AOcR4eqo
春休みでスレの勢いが上がり、スレの品質が落ちた。
874デフォルトの名無しさん
垢版 |
2019/03/28(木) 13:22:32.10ID:des+yyG9
義務教育でプログラミングとか教えたら
もっと変なの増えそう
python界隈に来ないで欲しい
2019/03/28(木) 13:29:56.71ID:t1sztID7
>>874
こういう金融とかの兵隊養成用だから競合はしないと思う
https://pbs.twimg.com/media/DwtF98FUwAIU166.jpg
2019/03/28(木) 13:49:18.36ID:KoUoPeo+
そのへんの化石言語はいい加減消滅させるべき
2019/03/28(木) 13:51:20.07ID:0CdADxX3
化石じゃないまだドメイン次第で現役Fortranだってこの間新しい仕様出たし!ってつっかかられるぞ
08をちゃんと実装したコンパイラ出してから言ってくれよって気持ちだが
2019/03/28(木) 14:01:46.15ID:Csoqrb4z
>>873
お前が言うな
879デフォルトの名無しさん
垢版 |
2019/03/28(木) 14:03:11.91ID:CwLqpfbs
_____(コボル)

答え COBOL

_____(フォートラン)

答え FORTRAN

これのどこが問題集やねん!
2019/03/28(木) 14:08:39.40ID:t1sztID7
来年度からこれが流通するぞ
2019/03/28(木) 15:14:03.54ID:KoUoPeo+
ほんと役人どもがやることはいつもずれてる
2019/03/28(木) 16:17:03.97ID:yLTGLAEP
>>880
その言葉を見る限り、あなたは日本人じゃない気がする。
この文脈で、あなたが言いたかったのは、
「来年度からこれが流通するぞ」ではなく
「来年度からこれが常態化するぞ」
という事だったと思うから。
2019/03/28(木) 17:38:04.05ID:ADAikd1k
>>871
それ言い出すなら逆もまたしかりだろ
extern "C"すればCで出来てC++に出来ないことはないぞ。
2019/03/28(木) 17:39:39.59ID:ADAikd1k
だいたいC++にはasmがあるしな
アセンブラで出来ることは出来るんじゃね
885デフォルトの名無しさん
垢版 |
2019/03/28(木) 18:18:56.58ID:JEyrctWP
>>881
おまえらが役人からずれてるんだろ。
日本は公務員のための国やぞ。
2019/03/28(木) 18:20:50.90ID:KoUoPeo+
それは一理ある
日本は官僚統治国家だから
2019/03/28(木) 18:30:14.54ID:t1sztID7
公僕が・・・舐めてると潰すぞ
888デフォルトの名無しさん
垢版 |
2019/03/28(木) 18:32:28.62ID:des+yyG9
888
2019/03/28(木) 18:42:36.05ID:pafVG92t
でも、ターゲットにRubyとC++を選択したのは正解だと思ってるよ。
2019/03/28(木) 18:43:27.34ID:KoUoPeo+
Rubyはない
2019/03/28(木) 18:45:09.06ID:yLTGLAEP
日本政府は日本人と将来の日本の年金などのための政治を行えばいいのだから、
日本人が作ったものを使うように推進するのは悪いことではない。
余りにも使いにくいもので無い限りは。
だからWordをやめて一太郎を使うようにしたり、Rubyを使うようにしたり
するとすれば、それは英断だよ。
892デフォルトの名無しさん
垢版 |
2019/03/28(木) 18:45:11.14ID:JEyrctWP
RubyはWindowsでまともに動かないから、Linux採用するのかな。
2019/03/28(木) 18:48:52.21ID:pafVG92t
>>892
自分の環境では、Windowsで普通に動いてると思ってるけど。
894デフォルトの名無しさん
垢版 |
2019/03/28(木) 18:49:56.61ID:JEyrctWP
関数型教えればいいのに。
2019/03/28(木) 18:58:40.35ID:KoUoPeo+
教えるなら実用性と手軽さからしてC++、Javascript、python
2019/03/28(木) 18:59:00.99ID:yiBU3VRL
>>883
えっ配列初期化子がC++でも使えるように?
897デフォルトの名無しさん
垢版 |
2019/03/28(木) 19:00:37.17ID:des+yyG9
>>891
国産のを応援するのは判るが
それが利権になってただのクズが集まって来たり
金貰うと進歩が止まったりするのが日本の悪いところ
2019/03/28(木) 19:04:55.98ID:KoUoPeo+
国産であっても良いものでなければ応援するべきではない
Rubyは滅ぶべき言語トップ10に入る
2019/03/28(木) 19:07:54.30ID:OttlZ3Q/
>>896
書き方同じじゃなくても同様の事が出来るだろ
cで出来ないこと無いって話にたいしてなのだから
2019/03/28(木) 19:20:56.01ID:pafVG92t
PythonとRubyだったら、Rubyもそんなに悪くは無いと思う。
Pythonは可読性が悪いように感じる。空白インデントだけでブロックや
関数の終わりを決めてしまうので、内部関数が終わってるかどうか分からず、
人の書いたソースが読みにくくて困ったことがある。
2019/03/28(木) 19:39:26.72ID:lj2W5NqA
C++er的には
動的型の時点でノーサンキューだろ
そういうのが嫌でC++使ってるんじゃないのか
2019/03/28(木) 19:40:51.32ID:lj2W5NqA
特にRubyは教祖様が
絶対に型は書きたくない
って駄々こねてるから

これはもう日本のガラパゴス化が一層激しくなるな
2019/03/28(木) 19:43:44.68ID:jnmpmBFr
pyは読みより書きの方が問題
間違えてインデントけずっても気づかないことが多い
2019/03/28(木) 19:51:12.67ID:WN0VVTEM
>>901
個人的には型のある言語の方が好きだ。
型があった方が、変な問題にはまる率が下がるので開発が速く進む。
大規模開発には絶対、型が必要。
初心者にも大人気言語だった元祖のBASICも、Aが浮動小数点型、A$が文字列型で、
確か、A% が整数型。配列は DIM A(100) や、DIM B%(10,10) などで、
宣言は省略できる場合が多いが、ちゃんと型はあった。
Rubyなどは、A にあらゆる型が入れられるので、関数呼び出しなどが
かなり怖い。間違っていても問題の切り分けが出来ないので「はまったら」大変。
だから、とても慎重にコードを目で見ないといけなくなる。
2019/03/28(木) 19:52:41.47ID:wxB03uV3
>>903
Pythonで、良く分からなかったのが、インデントの空白の個数。
2個でも4個でも好きな量を選べるのだろうか?
2019/03/28(木) 19:55:00.97ID:KoUoPeo+
言語仕様上は揃ってさえいればいい
2019/03/28(木) 19:59:44.37ID:WN0VVTEM
>>906
やはりそうだったんだ。だから余計に解読できなかったんだな。
エディタでカラムを数えたり、上まで戻ったりして、やっと認識していた。
でも不安が残った。ブロックが終わってるのかどうか物凄く分かりにくい。
2019/03/28(木) 20:02:46.54ID:eE4sGejC
今のPythonはカオスだからな
見易い文法目指していたはずが
内包表記やらラムダやら見づらくする文法が増えて推奨までされている

フレーム作るか否かもわかりづらいことこの上ない
2019/03/28(木) 20:22:58.04ID:3LZYwZb1
>>851
「実装A, B, C があり、機能 f について、A.f, B.f C.f のそれぞれに、こんなメリデメがあります!」
なら理解できますが、>>820 は、
「A.g, B.f, C.f のそれぞれにこんなメリデメがあります!」
でしょう?それって変じゃないですか?
A.g とかじゃなくて、A.f で比べて欲しいのですが?
2019/03/28(木) 20:33:45.97ID:BoT1RII7
>>908
最近の言語全般に言えることだな。
無駄機能入れすぎなんだよ。
クソみたいなシンタックス入れるくらいならライブラリを充実させるほうが正しい。
2019/03/28(木) 20:46:24.22ID:jnmpmBFr
メリデメっていうやつw
すまんがめっちゃ底辺臭する
912デフォルトの名無しさん
垢版 |
2019/03/28(木) 20:56:41.12ID:JEyrctWP
ハイクラスの人はなんて言うんだよ。
2019/03/28(木) 21:07:04.95ID:siqlJJfC
>>882
お前さんの言い換えた方の日本語もかなり不自然だよ。他人の言葉尻をとらえてどうこう言えるほど、お前さんも日本語が得意な訳ではないだろう。
そもそも、普通の人はそんなことで日本人かどうか気にしたりしない。
2019/03/28(木) 21:20:29.56ID:1SvA7cSr
>>858
文字列の途中に格納することは新仕様でもできるでしょ?
2019/03/28(木) 21:28:18.93ID:3LZYwZb1
>>912
「不正確な略語を口にするのは doubleplus-unwise である」
という事実をジョージ・オーウェルに学びました、彼は略語と esperant は毛嫌いしていたようです
https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AF
2019/03/28(木) 22:54:40.69ID:e7Ukr6X3
double型の変数a、bがあるとして、
a/bが整数かどうか判定するには
2019/03/28(木) 22:55:53.73ID:Qz7GRSnS
厳密には無理
2019/03/28(木) 23:04:52.64ID:e7Ukr6X3
なぜ>>917はベストを尽くさないのか
2019/03/28(木) 23:06:15.20ID:2+cLemOj
標準のコンテナなんて使う理由ある?
遅くて使い物にならん

ストリームなんて実用に耐えれないくらい遅いだろ
2019/03/28(木) 23:08:40.51ID:t1sztID7
もう飽きたからいいよ
2019/03/28(木) 23:14:08.39ID:e7Ukr6X3
ではa/bに最も近い整数はどうやったら出せますのん?
2019/03/28(木) 23:17:25.36ID:AOcR4eqo
(int)((a + 0.5) / b)
2019/03/28(木) 23:17:26.82ID:EVp1RRUC
a/bを丸めりゃいいと思うが?
2019/03/28(木) 23:21:48.84ID:KoUoPeo+
std::round(a/b)
2019/03/28(木) 23:22:20.86ID:e7Ukr6X3
両方の案を採ってC++14ではstd::floor(a / b + 0.5)にケテーイ?
C99なら丸め関数あるけど…
2019/03/28(木) 23:23:14.15ID:KoUoPeo+
CにあってなぜC++にないと思った
2019/03/28(木) 23:24:22.62ID:e7Ukr6X3
C99はもはやC++とは別物やし…
2019/03/28(木) 23:33:50.74ID:eE4sGejC
丸めって絶対の正解がないからな
929922
垢版 |
2019/03/28(木) 23:36:38.79ID:AOcR4eqo
お恥ずかしい。素で間違えた。括弧の位置が違う。
930デフォルトの名無しさん
垢版 |
2019/03/28(木) 23:49:56.39ID:JEyrctWP
>>918
それは自分に問いかける言葉だったんじゃ。
2019/03/29(金) 00:05:03.99ID:daDbIW6D
>>930
>>918についてはまだ誰も判定精度のベストを尽くしていない件について:
多分
 std::abs((a/b) - ((a/b)の小数以下を丸めた値)) <= std::numeric_limits<double>::min()
あたりがベスト?
932デフォルトの名無しさん
垢版 |
2019/03/29(金) 00:08:06.95ID:KSfDlte3
>>931
いや、元ネタの話。
933デフォルトの名無しさん
垢版 |
2019/03/29(金) 00:09:22.47ID:KSfDlte3
上田次郎の言葉。
2019/03/29(金) 00:20:10.55ID:0t+U2b3s
一太郎は自滅したからなぁ
どうしているのかと思えば名簿の話であんなことしていたのかと・・・
上手くやればいくらでも出来たのに勿体無い
2019/03/29(金) 00:38:09.37ID:Sh9jl/tc
>>931
いやこの場合はイプシロンじゃなくバイナリ一致で比較すべき
2019/03/29(金) 00:53:41.69ID:e60P0oPD
まだ428万なのに一勝で400くらいしか上がらなくなったんだけど中堅名乗ってええか?
レス数が900を超えています。1000を超えると表示できなくなるよ。