C++相談室 part141

■ このスレッドは過去ログ倉庫に格納されています
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/26(火) 19:30:19.23ID:qKdh3SVz
cout よりも printf が相対的に良いという人はたくさんいると思うが、
iostream が特に駄目ってだけで、
C++ 的に見れば printf がセンスいいとはとても言えんぞ……
2019/03/26(火) 19:31:00.18ID:eqSsbUbG
昔みたいにドヤ顔してboost使う必要がなくなったのはいいことだと思うよ。標準が充実していってさ。
最初からヌエ的な発展しかありえないのはそういうものだと思うし。
2019/03/26(火) 19:31:45.68ID:5p1uA41w
>>747は多分>>743とかに向けたつもりだと思うんだが
なぜか逆の立場の>>749がダメージ受けてるという
2019/03/26(火) 19:34:05.19ID:5p1uA41w
あ、すまん逆ではなかったな
2019/03/26(火) 19:39:12.76ID:fe5vrK8S
ただ、多数決というのは、正しくも良くも無いけどな。
2019/03/26(火) 19:48:04.23ID:gp3lODpj
だったら君が最高の言語を作ればいい
設計は君の最高のセンスをふんだんに盛り込んで独裁的にやればいいよ
2019/03/26(火) 19:59:43.01ID:otrrnTwO
とりあえず全員ダメージ受けとけ。
2019/03/26(火) 20:35:50.63ID:OoUi3Qk7
stlのないC++なんてクリープ入れないコーヒーみたいなもん
2019/03/26(火) 21:11:51.51ID:ExDeReqX
>>740
C++ の仕様にSTLがないって本当かいな、と思って調べたら
確かに n3337.pdf (C++11のドラフト?) には STL という単語が出てないね。
STLのセンスが良いか悪いか、使うべきか使わざるべきか、
その辺について意見を出せるほど見識はないんで、事実の報告だけ。


『プログラミング言語C++』第4版に「STLなんちゃら」って章が
いくつか載ってるから、仕様の言葉だと思ってたわ。
2019/03/26(火) 21:17:41.21ID:zBAPpXX5
プログラミング言語C++に後にSTLとなるテンプレートライブラリ作ってストロストラウップに勧めに来た奴が居たので
ストロストラウップが試したら、彼が信条とする「良いライブラリ10箇条に全部あてはまってこりゃスゲーとなったという
エピソードがあったような
なかったような
2019/03/26(火) 21:25:01.06ID:5p1uA41w
STLは俗称だし、定義も曖昧
皆そう呼ぶのが便利だからSTLという呼び方してるだけ

HPの研究所で働いてたAlex Stepanovが発案して94年あたりに持ち込んだっぽい
ライブラリじゃなくて、いわゆる「汎用コンテナ(データ構造)ライブラリ」についてBjarneが重要と考えたチェックリストのほぼ全部にパスした
2019/03/26(火) 21:30:19.89ID:pGZA6Dfc
c++の仕様にSTLが無くてもrange-based forのようにSTLが備えてるbegin,endに依存した構文は出てる。
2019/03/26(火) 21:41:34.25ID:aW2tbkLS
STLつってもどうせvectorとmapくらいしか使っとらんだろ。
まあそれで十分なんだが。
2019/03/26(火) 21:52:00.50ID:2lj4xCZe
STLという言葉を発することがもうほとんどなくないか?
stdは使うけど、まあどっちも輪郭のはっきりしない言葉だ
764デフォルトの名無しさん
垢版 |
2019/03/26(火) 21:53:11.01ID:D6PYEJQv
STLは洗練されている。
素晴らしいデザイン。
コンセプトが入ったらさらに洗練できると思う。
2019/03/26(火) 21:58:59.96ID:5P0efKyY
>>742
リソースが制限されてるというより、最大限のパフォーマンス出す場合な
つまりリソースがリッチかどうかは直接関係ない
AAAのpcゲームとかね

パフォーマンスそこそこでいいならc++なんか使う理由がない
遊び以外
2019/03/26(火) 22:03:45.01ID:qKdh3SVz
>>765
計算量はリソースの一種だで。
2019/03/26(火) 22:05:23.77ID:Pu4N06vt
最大限のパフォーマンスを出すために作ったeastlみたいなのも標準の使用感踏襲するくらいには標準の設計は良くできているよ
768デフォルトの名無しさん
垢版 |
2019/03/26(火) 22:05:31.83ID:D6PYEJQv
STLはわしが育てた。
2019/03/26(火) 22:17:08.86ID:qKdh3SVz
そうか。
2019/03/26(火) 22:23:19.39ID:d5snerrZ
tupleはSTL?
2019/03/26(火) 22:33:50.26ID:5P0efKyY
>>767
移行が楽になるようにむやみにapi変えないのはソフトウェアの定石
それより変わったところ、拡張されてるところに注目しようか
772デフォルトの名無しさん
垢版 |
2019/03/26(火) 22:49:38.25ID:D6PYEJQv
C++2zには俺の作ったライブラリが標準搭載されると思う。
2019/03/26(火) 23:13:14.99ID:T41fm+6R
天下のマイクロソフトが考えたATLでもいいんだぞ
2019/03/26(火) 23:32:43.00ID:zBAPpXX5
ATL(adult T-cell leukemia-lymphoma)は語呂が悪い
2019/03/26(火) 23:38:15.00ID:zBAPpXX5
std::tuppleはPythonフリークが無理矢理ねじ込んだのではないか
C++11で追加された可変長テンプレートなくして有り得なかったコンテナやし
std::pairと被っとる
2019/03/26(火) 23:43:43.21ID:T41fm+6R
tupleなんかどの言語にもあるだろ
現代の言語の基本的概念の一つで当然サポートされるべき
2019/03/26(火) 23:49:19.01ID:WJaRDiZ5
ライブラリでサポートだけどな
これがダメなところ
2019/03/27(水) 00:07:37.22ID:QPwampGA
何で?
2019/03/27(水) 00:38:40.54ID:Wsy7XdfH
>>759
じゃあ、ストロストラウップの物を見る目が無い。
彼自身のセンスが悪いんだ。
2019/03/27(水) 00:42:46.01ID:bx8pTnoV
なんちゃらラウップは言いにくいからいつも
ビョーーンさん、と呼んでいる
2019/03/27(水) 00:47:30.04ID:Mw4em8Pz
tupleは型関数でも重宝するよね
2019/03/27(水) 00:56:42.26ID:ZXIZSYy+
タプルはなにが嫌といって get<0> とかいうのがものすごく嫌
要素が4個ぐらいになったら1年後ぐらいにコード書き直そうとして
・・えっとこの値取りだすの get<1> だっけ? get<2> だっけ?とか絶対なるから使わない
2019/03/27(水) 00:58:48.50ID:DfX99uD1
そんな貴方にenum定数
2019/03/27(水) 01:03:41.91ID:Mw4em8Pz
いい加減enumにメンバ関数定義させろと。
enum classの時にどうにかすべきだった気もするが。
後は静的なリフレクションも
enumと文字列の相互変換とか殆ど定型コードになるのにいちいち書くのが面倒すぎる。
マクロで書くのも微妙だし
2019/03/27(水) 02:16:29.42ID:1nw30Wbv
>>779
センスがあるか無いか知らんけど、
すっぽすっぽ先生が是とした以上は C++ 的ではあるはずだろ。
それが駄目なら C++ が駄目だし、駄目なので君は使わなくていいよ。
2019/03/27(水) 02:25:21.92ID:Mw4em8Pz
標準コンテナ使わないらしい人の
抜群のセンスを見てみたいので、コードの一部でも見せて欲しいものだな
2019/03/27(水) 02:59:41.39ID:V3NaDuAs
Eigenが絶妙に不便なんだけど行列演算を標準でサポートする予定ってあるの?
2019/03/27(水) 03:31:56.74ID:Wsy7XdfH
>>786
アイデア盗まれるだけ損。
2019/03/27(水) 06:12:39.11ID:0QkCU47u
センスが悪いというだけで具体的にどこがどう悪いか、どんなだったらセンスが良いのか言わないと、説得力ゼロだな。
790デフォルトの名無しさん
垢版 |
2019/03/27(水) 06:31:30.44ID:J3LATpLk
>>743
+1
791デフォルトの名無しさん
垢版 |
2019/03/27(水) 06:40:01.31ID:J3LATpLk
>>780
禿
2019/03/27(水) 06:52:27.00ID:Ojl0EpZo
>>784
定型文ならtemplateで書けないの?
2019/03/27(水) 07:12:11.84ID:Mw4em8Pz
>>792
やりたいことは単にenumの値の識別子とその文字列を対応付けるだけなんだが、templateで書けるの?

enum class Color {
Red,
Green,
Blue
};
inline auto to_string(Color c)
{
switch (c){
case Color::Red:return "Red";
...
}
}
こんな感じのことがしたい
2019/03/27(水) 07:24:00.67ID:DfX99uD1
マクロ Stringizing Operator (#) を使うしかないのでは。
2019/03/27(水) 07:44:38.63ID:QPwampGA
>>789
×センスが悪い
○自分の趣味合わない
だから説明する必要なし嫌い嫌い言っておけばおk
ちょうど114514回目のstd:get嫌い民も現れたところだ
2019/03/27(水) 07:59:25.35ID:KDFmmUkx
ストラウストラップも例外入れるかどうかあたりまでは
かなり真剣に仕様を考えてた印象だけれどそれ以降はタガが外れた感じだ。
最近はもうどうしようもなくなってる。
2019/03/27(水) 08:00:04.09ID:Ojl0EpZo
>>793
その処理ならmapかunordered_map使うのが良くないだろうか?
2019/03/27(水) 08:06:10.74ID:QPwampGA
なお誰もストラウストラップに意見を出せるほどプログラミング言語の勉強をしていないもよう
2019/03/27(水) 08:07:01.17ID:Kgbo0Zp4
>>797
逆変換はunordered_mapだな

文字列化の方はswitch使うのが一番コンパイラがいい感じのコードにしてくれる
2019/03/27(水) 08:25:16.34ID:HgdvOlrd
関数の引数として vector<int> を参照渡ししたいのですが、これのデフォルト引数を空の vector<int> にする方法ってありますか
2019/03/27(水) 08:33:50.59ID:pdL3Pyxp
std::vector<int> &v = std::vector<int>() じゃないのん
2019/03/27(水) 08:43:24.12ID:HgdvOlrd
>>801
参照渡しでもそのやり方できますか?
2019/03/27(水) 08:45:04.79ID:pdL3Pyxp
やればわかる
2019/03/27(水) 09:24:45.56ID:7IO5xMdH
const?
2019/03/27(水) 09:33:08.23ID:p4oEJ8zd
>>786
センスうんぬんを言ったのはおれじゃないけど、
標準ライブラリ使わないという主張に対して、ソースがエレガントかどうかを問うのは目的がわかってない

端的にいうと標準ライブラリのオーバーヘッドが許容できないんだよ
多少記述が汚くなろうがパフォーマンス引き出すのが優先

cとc++のベンチだと結局cの方がいいスコアになってること多いだろ
(全てがそうでないのは知ってる)
そこをcと同等まで引き上げるわけだ
2019/03/27(水) 09:36:50.33ID:QPwampGA
だったらC使ってれば
それ以外の選択肢無いんだから
2019/03/27(水) 09:40:51.50ID:p4oEJ8zd
>>806
そこはアセンブラ使えばというところだろ
2019/03/27(水) 09:40:55.11ID:pdL3Pyxp
>>804
VC2017だとconstじゃなくてもいけた
てか参照のデフォルト引数ってconst限定だったのか
仕様変わったのかVCだけおかしいのか知らんけど
2019/03/27(水) 09:45:55.40ID:p4oEJ8zd
いうまでもなく、ボトルネックでないところは労力はかけない
メンテが楽な手法を使う
それに完全にゼロコストなものは普通に使うさ
2019/03/27(水) 09:52:34.13ID:U9bjaUkC
標準コンテナでcより遅くなるってどんなパターン?
単方向listで十分なのにlistだと双方向とかそんなやつ?
あんまりlist使わんからよくわからんが
vectorは使い方を余程間違えない限り大抵代替品より速いような

メモリ確保回りはallocator使えばいいし
data使えばただのメモリブロックだよね
2019/03/27(水) 10:01:31.18ID:QPwampGA
99%iostreamのこといってるからな
2019/03/27(水) 10:04:51.88ID:tQ4XPcUj
>>810
要素の追加時に容量の拡張が必要かどうかのチェックが入ったりするから、オーバーヘッドはゼロではないよ
2019/03/27(水) 10:08:24.05ID:U9bjaUkC
>>812
それpush_back or emplace_back使っているのが悪いのでは
cの同等コード書いてもチェックは必要だろ
チェック要らんことが分かっているならresizeしておけ
2019/03/27(水) 10:12:49.51ID:QPwampGA
Cで作っても同じでワロタ
2019/03/27(水) 10:22:17.37ID:tQ4XPcUj
>>813
便利なものがあれば人間は使ってしまうもんだ
その積み重ねがパフォーマンスの差に繋がる
俺は一般には便利なものを使って時間を節約することでボトルネック解消にかける時間を確保でき、
結果的にパフォーマンスはより高くなると思うけど、そこはスケジュールの制約次第だな
2019/03/27(水) 10:29:47.46ID:9ko5ghKo
Cマスター「C++は配列に追加するときにサイズチェックするから遅い(キリッ」

wwwwwwwwwwwwwwwwwwwwww
こんな雑魚がでかい顔してるからいつまでもセキュリティホールがなくならないんすなあ
2019/03/27(水) 10:34:12.90ID:9ko5ghKo
Cマスター「要素追加時にサイズチェックするという便利さの積み重ねがパフォーマンスを落とす(キリッキリッ」
やべえ笑い死にしそう
笑い事じゃないけど
2019/03/27(水) 12:49:47.89ID:DY72tOrL
プロファイラで調べて本当に問題あるならどうにかするけど
ただわざわざc的に書いても大抵誤差レベルでしか変わらんよね
どちらかと言うとバッファの確保の仕方を工夫した方が効果が大きい
2019/03/27(水) 13:05:12.78ID:fzYgEwLp
>>816
トレードオフもわからん雑魚
2019/03/27(水) 13:06:52.67ID:C+1U7WOU
>>810
・以下、要素数が N とする。

・C/C++ の原定義の固定長配列は、要素の代入に1クロックしかかからない。もちろん、
 O(1)で、物凄く速い。なお、固定長なので「代入」であり「追加」ではない。

・Listはリストだから1個の要素の追加はO(1)で、要素数に依存せず安定した速度が出るが、
 内部で、newされるはずなので、最低でも170クロックほどかかってしまう。

・Vectorは動的配列だから、最悪のケースでは要素の追加にO(N)の時間がかかり固定長配列より遅くなる
 と思う(よく知らない)。
2019/03/27(水) 13:34:58.24ID:tQ4XPcUj
>>817
複数の要素を追加するとき、わざわざ事前にまとめてリサイズするか?ということだよ
1要素ずつ処理するのは生ポならかえって面倒になることが多いし、見た目にいかにも非効率そうなコードに見えるから、大抵の人は自然にそうするだろう
一方vectorだとどうだろうね
心理的な問題なの
2019/03/27(水) 13:45:54.22ID:tQ4XPcUj
同じようなことはvectorに限らず一般的に言ええて、
例えばC++はRTTIの便利さ故にCと比較してプログラマが無駄なメモリの確保や破棄を行いやすい傾向がある
逆にCだと無駄に大きなバッファ作りがちだったり、バッファの使いまわしによりスレッドセーフでないコードを書きがちであったりする
2019/03/27(水) 13:46:41.13ID:tQ4XPcUj
すまんRTTIじゃなくてRAIIな
2019/03/27(水) 14:07:44.29ID:xtV64SvS
クロックなんてわからんじゃろ
2019/03/27(水) 14:29:28.16ID:t7f2HshG
VC++2017なんだけど
デストラクタで投げた例外をキャッチできずabortするのはVC++の仕様?
RAIIとラムダを駆使した自作finally内で
例外投げたらキャッチできずabortしてハマったわ
デストラクタ内で例外投げるのが汚いのは知ってたが
そうか、自作finallyもデストラクタ利用してるからダメなのかな
2019/03/27(水) 14:35:28.06ID:fzYgEwLp
デストラクタはデフォルトでnoexceptやで
827デフォルトの名無しさん
垢版 |
2019/03/27(水) 14:54:30.22ID:t7f2HshG
サンクス
デストラクタをnoexcept(false)指定したらcatch出来たわ

てことは自作finallyは念のためnoexcept(false)指定にしたほうが良いのか
それか自作finally内で例外投げるのは完全禁止にするか
悩むわ
828デフォルトの名無しさん
垢版 |
2019/03/27(水) 14:56:55.41ID:t7f2HshG
まぁでもよく考えたら
例外が発生して自作finallyが実行されてる時に
さらに自作finally内で例外飛ばしたら二重例外になるから危険か
なるほどなるのど
2019/03/27(水) 17:38:06.36ID:8XRRZQAn
>>820
意味がわからん
そもそもCでも固定長配列の代入は実データのコピーを伴いO(n)だ
アドレスや参照のやり取りならO(1)
2019/03/27(水) 17:50:46.31ID:fzYgEwLp
全体じゃなくて一要素やろ?
2019/03/27(水) 17:55:38.42ID:8XRRZQAn
あーそう言うことか
固定長的に使いたいなら始めにresizeするだけじゃない

便利だからチーム内で使ってしまう人がいることを問題にするより、使わずにいちいち独自コードで処理されて余計遅くなったり、バグ仕込まれたりする方が余程ヤバイだろ
2019/03/27(水) 18:00:35.88ID:xtV64SvS
先生、配列の長さにリミットを設ける方法を教えてください
2019/03/27(水) 18:00:36.53ID:fzYgEwLp
まぁそれでも範囲チェックは入るし、常にヒープ使われるし
それすら問題になるようなクリティカルな場所なら生配列なりarray使えばいいと思うけど
適材適所じゃないかねぇ
2019/03/27(水) 18:03:25.00ID:97C5Fzq7
operator[]なら範囲チェック入らんよ
2019/03/27(水) 18:14:58.29ID:QPwampGA
末尾に追加の話だろ
2019/03/27(水) 18:15:04.13ID:fzYgEwLp
うお、マジだ誤解してた
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バイト、と仮定した場合の話。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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