C++相談室 part146

■ このスレッドは過去ログ倉庫に格納されています
2019/11/07(木) 11:35:36.76ID:4wggfTwe
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
2019/11/27(水) 15:43:43.07ID:PahKH909
下の方が、スカラー値等の既存型や配列向けの特殊化をし易いメリットもあるかもねー
2019/11/27(水) 15:55:14.01ID:xImtWZAs
ベクトルの引き算を定義してやるのはありでは
310デフォルトの名無しさん
垢版 |
2019/11/27(水) 16:11:06.28ID:KtqS+hCI
下を造っておいて
operator - で下のを利用 >>309 と同じ
どちらも inline
311デフォルトの名無しさん
垢版 |
2019/11/27(水) 16:12:16.87ID:KtqS+hCI
ああ同じではないわ
ベクトルの引き算はスカラーじゃなくてベクトル
ベクトルの絶対値を定義する
2019/11/27(水) 16:29:07.34ID:MN5dlGGA
abs(a-b)
2019/11/27(水) 18:11:30.16ID:p98u22dC
ベクトルの加減算や符号は紛れが無いのでオペレータで実装

乗算は内積、外積と要素ごとの積の3種類あるので
関数にする

3次元ベクトルも作る可能性があるなら
2次元ベクトルだとわかる名前にしておく
可能性が無いならそのままで

絶対値やノルム、象限などをグローバルにするかメンバ関数にするかは一長一短
設計ポリシー次第
2019/11/27(水) 19:16:22.98ID:N9ggbkQ1
>>303
私も下
>double GetDistance(const Point &p1, const Point &p2)
を friend 関数にします、大事にするのは対照であること、です
2019/11/27(水) 19:21:07.28ID:fyVQDs9d
>>187
メモリフラグメントを起こさないようにわざわざメモリプール切ってるのに
new/delete繰り返すオマエみたいなアホがいるからまともな製品ができねぇんだろww
2019/11/27(水) 19:29:28.78ID:vSkP4LPU
>>315
ほーう?
メモリプールでフラグメントが防げるのかww
2019/11/27(水) 19:31:20.95ID:nSz8Pwyp
>>314
オペレータだとメンバ関数な実装多いよね
なんでだろう
2019/11/27(水) 19:40:34.02ID:nSz8Pwyp
RTOSを使うような小規模環境だと
ヒープをしなかったりアロケートのみにしたりする
そんな環境でもC++は便利なので使えるなら使いたい
2019/11/27(水) 19:40:48.50ID:nSz8Pwyp
ヒープを搭載しなかったり
2019/11/27(水) 19:48:12.34ID:nSz8Pwyp
OSレスでもC++が使えるなら使う
実際それで製品出した
2019/11/27(水) 19:52:22.88ID:q8B3tEUN
対称が大事なのって、交換法則が成り立つ計算だから?
2019/11/27(水) 19:54:03.88ID:nSz8Pwyp
引き算の立場は?
2019/11/27(水) 19:57:18.53ID:nSz8Pwyp
主役がはっきりしてる場合はメンバ
同等な重要度の時は非メンバ

私の場合はだいたいこんな感じ
2019/11/27(水) 19:58:30.31ID:nSz8Pwyp
対称かどうかはあまり関係ない
2019/11/27(水) 20:25:32.56ID:vYtjQlD0
対称性が特に問題になるのはオペランドの型が異なるケースだな
対称な演算a.op(b)をaのクラスに実装したらbのクラスにも同じものをコピペするのか?
C#の演算子オーバーロードがstaticなのはそのへんが理由だとか
Pythonなどのスクリプト言語では基本的にインスタンスメソッドとして演算子を実装するけど、
それは動的型故に事前に実装を解決できないからだね
2019/11/27(水) 20:29:53.87ID:EGeQZX97
>>317
かつて非メンバ関数のオペレータを名前空間の外から呼び出そうとするととても残念な気持ちになるからじゃね
2019/11/27(水) 20:44:42.44ID:0U9h+SK3
オペレータオーバーロードを使うとカッコイイ気分にひたれるからだろ
それ以外の理由なんてあるのか?
2019/11/27(水) 20:45:44.57ID:E2H9effp
private変数の書き換えを伴うものだけメンバだな
Pointが座標値しか持ってないようなのならコンストラクタ以外は持たせない
2019/11/28(木) 01:38:08.55ID:PoPpbfsh
代入は普通メンバだろ

=
+=
-=
*=
/=

[ ]も
2019/11/28(木) 01:44:12.13ID:PoPpbfsh
当然符号も
2019/11/28(木) 02:14:28.33ID:+45JwpRI
>>303
これは後者が良い場合が多い。
型変換の対称性が絡むんだよ。

たとえば std::tuple<double, double> から Point への変換コンストラクタが用意されているようなとき、
メンバ関数として実装されていると左辺ではこの型変換が考慮されず、右辺では考慮されるということになる。
2019/11/28(木) 02:50:39.48ID:4GnG2KNj
>>329
代入系と添字はそもそもメンバとしてしか書けない
2019/11/28(木) 06:43:27.57ID:PoPpbfsh
>>332
>>328に言って

>>331
対称性は関係ないって
Point * double
だって型変換された方が都合が良いなら非メンバだろうに
2019/11/28(木) 08:02:30.92ID:A3g54Di2
>>316
ほーう?
そんなことすら知らないのかww
2019/11/28(木) 08:09:05.07ID:YpOyjZW5
>>334
ハッタリしかできることねえようだな
まあ、そうだろう
2019/11/28(木) 08:20:32.24ID:PoPpbfsh
フラグメントが問題になるならアロケート専用で解放出来ないようにするとかそもそもアロケート出来ないようにするとか
固定サイズを頻繁になら独立させておけばフラグメントしない
2019/11/28(木) 08:21:42.93ID:PoPpbfsh
ヒープはヒープで1個の研究分野になるくらい
いろんな技術、方法がある
2019/11/28(木) 17:46:42.56ID:+45JwpRI
>>333
???
理解できないのでもうちょっとくやしく
2019/11/28(木) 18:11:40.54ID:PoPpbfsh
>>338
今回たまたま対称であったというだけで
対称性が理由じゃないってこと

ベクトル※ベクトル
ベクトル※スカラー
ベクトル※行列
ベクトル※矩形

なんであれ型変換された方が良いなら非メンバ
2019/11/28(木) 18:23:49.08ID:+45JwpRI
>>339
なるほど、一般化した場合の話になってるわけね。
341デフォルトの名無しさん
垢版 |
2019/11/28(木) 19:15:35.47ID:nxFPf5Ar
begin()とend()があればRangeなんですか?
2019/11/28(木) 23:41:46.98ID:iCLeSa8c
だいたいそうよ
343デフォルトの名無しさん
垢版 |
2019/11/29(金) 04:19:50.28ID:KHTBF+uC
そうですか。
どうもありがとうございます。
344デフォルトの名無しさん
垢版 |
2019/11/29(金) 08:06:17.26ID:R3LtoROu
新明解C++買ったけどなにもしてない
345デフォルトの名無しさん
垢版 |
2019/11/29(金) 08:29:36.34ID:KHTBF+uC
std::uint8_tってstd名前空間にあるけど、名前空間で修飾しなくても使えるのは何故ですか?
2019/11/29(金) 08:53:08.98ID:7m3ynrwG
>>345
usingを使っているから。
347デフォルトの名無しさん
垢版 |
2019/11/29(金) 09:06:38.46ID:KHTBF+uC
>>346
自分でusingしてなくても大丈夫ですか?
348デフォルトの名無しさん
垢版 |
2019/11/29(金) 09:34:32.80ID:N/f9f1S7
a[i] = b;
みたいなのき
a に対して a.setitem(i, b); するのと
a.getitem(i) が参照を返す様にしておいて a.getitem(i) = b; するのと
どっちが正解?
2019/11/29(金) 09:41:11.46ID:B0LTR+GE
JavaのArrayListは a.get(i) = b; になってるので長いもんには巻かれろと思考停止で真似るだけ
2019/11/29(金) 11:40:28.80ID:oVgX/GuB
>>345
#include <cstdint>は
#include <stdint.h>
つまりCのライブラリだからだ

typedef unsigned char uint8_t;

#ifdef __cplusplus
namespace std {
using ::uint8_t;
}
#endif

こうなっているだけだ
2019/11/29(金) 11:53:00.94ID:Ml/gOmNO
さすがに整数型にまでstdつけるのはうざい
なのでcのヘッダーを使ってる
352デフォルトの名無しさん
垢版 |
2019/11/29(金) 12:40:38.17ID:pYMGuCeV
stdを省略する方がウザい
2019/11/29(金) 12:45:20.21ID:gmGtMFq3
何の情報も増えないし紛れも何もない

意味の無い情報に5文字も余分に使いたくない
画面も入力の手間も
2019/11/29(金) 12:47:51.78ID:gmGtMFq3
int8_t がcharで、std::int8_t がsigned char とか?
それは御愁傷様
2019/11/29(金) 12:52:13.51ID:lef7gBlN
STL使ってスタティックビルドしてるコンソールプログラムあるけど、
ファイルサイズ 400KBぐらいだな。圧縮した状態で200KB
これが20KBぐらいに減るのかー、でも誰も喜ばないだろうな。
2019/11/29(金) 13:01:25.99ID:0dBBAnUQ
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
2019/11/29(金) 14:15:39.12ID:J8eB3+F9
>>350 >>350
cstdint 内の名前はマクロを除いて std に入るはず。
グローバル名前空間でも定義されるかどうかは処理系定義じゃなかったっけ?

逆に stdint.h 内の定義はグローバル名前空間でアクセスできるけど、
std 内でも定義されるかどうかは未規定だったように記憶してる。

仕様を読み返すのが面倒なので誰か調査よろ。
2019/11/29(金) 14:21:40.41ID:Tp6caFY5
変数名をメモリやオーバーヘッド無しでエイリアスつける方法ありますか?
メンバ変数に shared_ptr<Data> m_data; みたいなのがあるとして
using text = this->m_data->member.text;
みたいに使いたい変数だけ別名で取り出したい
2019/11/29(金) 14:30:09.62ID:oVgX/GuB
現実問題としてCのライブラリをstdに入れるということ自体が馬鹿げた話だ
今の流れはuint8_tの話だが、extern "C"の関数は装飾名に名前空間が含まれない
2019/11/29(金) 14:35:12.66ID:yQ0DwMtc
>>358
一番簡単なのは、
auto &text = this->m_data->member.text;
とすることです。
2019/11/29(金) 14:37:49.63ID:Tp6caFY5
>>360
現状それでやってますが、コンパイル時に確定できるのなら他に方法があるのかと思いました
2019/11/29(金) 14:45:49.13ID:J8eB3+F9
>>361
そういう簡単なケースだと最適化でちゃんと消えてくれるんじゃね?
2019/11/29(金) 14:56:28.90ID:KzrCIvE1
参照解決のコストすら嫌なら
#define text this->m_data->member.text
2019/11/29(金) 14:56:51.37ID:GB3X2IZU
コンパイル時に確定してるじゃん
2019/11/29(金) 15:07:19.89ID:M3WjIH4t
むしろもとの書き方だと2度参照解決して3度足し算しているような…
2019/11/29(金) 15:21:18.81ID:YkvT9y9m
textに実行時にアクセスするなら
いずれにしろアドレス計算は必須になる

>>360のようにすれば
最適化がうんこで複数回計算されるのを防ぐ可能性すらある

アクセスしないならおそらく最適化によってアドレス計算コードは生成されない
367デフォルトの名無しさん
垢版 |
2019/11/29(金) 15:50:36.19ID:N/f9f1S7
inline付けるとかえって損か
2019/11/29(金) 17:45:51.93ID:/RbGsSZk
m_data の型が shared_ptr<Data> なことを気にしてるのかな。
shared_ptr の指す先のメンバを参照変数でバインドするのは無作法か、とか。

と言うか、上の話は俺の疑問でもあるんだけど。
2019/11/29(金) 18:15:50.93ID:4DEcYZGM
->
に副作用があるならそりゃ話は別だ
2019/11/29(金) 18:44:49.74ID:xP2G2+ZO
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
え?リリースするときスタティックリンクして配布するのかって?
ダイナミックリンクするけど?
2019/11/29(金) 18:46:27.54ID:xP2G2+ZO
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
え?リリースするときスタティックリンクして配布するのかって?
ダイナミックリンクするけど?
え?なんで俺が笑われてるの?
372デフォルトの名無しさん
垢版 |
2019/11/29(金) 20:21:36.93ID:KHTBF+uC
どうもありがとうございます。
2019/11/30(土) 16:27:23.28ID:4Yq6PogE
constexpr定数とconst定数って結局何が違うの?
2019/11/30(土) 16:40:26.74ID:WebQyLi7
コンパイラに対する単なるヒント
優れたコンパイラでも糞コンパイラでも動きほ同じ
中途半端なコンパイラだと最適化のレベルがもしかしたら違うかも
コンパイル単位にもよる
2019/11/30(土) 17:34:29.84ID:sGzVq6Pz
constexpr定数はコンパイル時に値が確定することが保証されている
2019/11/30(土) 17:35:37.90ID:iKPiHg5H
>>373
constexpr定数はconstexprな文脈を作る。つまり、
constexpr int a = func()
とするとfunc()はコンパイル時に実行される。当然constexpr関数でなければならない

一方、const定数はconstexprな文脈は作らない
const int a = func()
とした時、func()は実行時に処理される。constexpr関数である必要はない
2019/11/30(土) 17:40:18.51ID:4Yq6PogE
ああ、初期化に関数を使うと違いが出るんですね
それにconstexprの場合は初期化が保証されていると
ありがとうございました
2019/12/01(日) 01:46:51.73ID:j3uX5vWG
constexprの強みは、配列のサイズみたいな定数を要求される文脈で使えるってこと。
const変数だとこれができないから、昔はマクロで定数定義するしかなかった。
2019/12/01(日) 01:49:20.00ID:Hj4I5N6m
>>378 C++ではconst変数も一部定数式扱いになってたでしょ。だから>>373みたいな疑問が出る。
2019/12/01(日) 01:54:44.83ID:Nfz3Rlxp
sizeofと何が違うんだ
2019/12/01(日) 08:35:44.43ID:7fh/nHBZ
constは設計ミスが多いな
2019/12/01(日) 08:36:58.95ID:7fh/nHBZ
とても神リッチーが作ったように見えない
383デフォルトの名無しさん
垢版 |
2019/12/01(日) 10:24:23.58ID:gHT6E7kc
STLにはなぜ木が無いのですか。
2019/12/01(日) 10:27:51.87ID:sKSeAmO2
大昔のC言語時代に考えた物だから
関数を使った初期化が出来ない時代の
2019/12/01(日) 10:31:53.72ID:sKSeAmO2
>>383
std::set とか、内部は木じゃね?

汎用的な木?
ポインタのvectorで良くない?
2019/12/01(日) 10:56:13.36ID:SqfEoEmM
Javaでも.NETでも標準ライブラリに木は無いだろ
木はメモリへのシリアライズの仕方を工夫せずに素直にノード毎にnewしてたら殆どあらゆるケースにおいてクッソ非効率なデータ構造なので、
標準ライブラリとして提供する意義が薄い
誤った選択肢を提供することで余計にパフォーマンスを低下させることになるだけだ
2019/12/01(日) 11:03:00.54ID:sKSeAmO2
listもsetもノードごとにnewしてるけど
388デフォルトの名無しさん
垢版 |
2019/12/01(日) 11:15:38.03ID:gHT6E7kc
ダブルアレイを変形させて木を表現できないでしょうか。
子は親のIDを知っていれば良く、親は子の個数を知っていれば良いので、出来そうな気がするのですが。
2019/12/01(日) 11:16:42.54ID:SqfEoEmM
>>387
うん。だから遅いよ。
2019/12/01(日) 11:29:39.61ID:7fh/nHBZ
だから形容詞には比較や数値をつけろってば
それじゃ健康産業で不安を煽る悪徳業者そっくりだろうが
2019/12/01(日) 11:50:38.89ID:p3Z7Nr0h
遅いlistやsetがstlに入っていて使われ続けてるんだから
stlに入れない理由にはならないってことだよあほ
2019/12/01(日) 11:53:33.72ID:rKmqg7A0
いやそんなもん使うやつらがそもそもc++使う必要がねーって話だわ
2019/12/01(日) 11:55:51.88ID:YWi4MX0G
それはお前の個人的な意見?
それとも何かデータでもあるの?
2019/12/01(日) 12:11:13.07ID:p3Z7Nr0h
listやsetが適した用途があるから存在してるんだけどね
使いどころ間違ってるんじゃない?
2019/12/01(日) 12:14:27.64ID:p3Z7Nr0h
同じ用途なら
newやdeleteを使わなかったとしても
結局ノード作成時に空きエリアを探すことになるわけで
2019/12/01(日) 12:17:14.00ID:p3Z7Nr0h
ノード追加専用のスペシャルlistやsetなら速くなるけど
それはもはやlistやsetじゃない
2019/12/01(日) 12:21:44.69ID:vEIKl7N1
プログラムのすべての部分で最速の選択をする必要なんて全く無いのに>>392みたいなことを言うやつはCかFortranで書けばいいんじゃないかな
2019/12/01(日) 12:29:30.42ID:SqfEoEmM
>>394
残念ながら、setはともかくlistが適しているシーンは実際にはほとんどない
途中への少数の要素の挿入削除が頻繁にあって事前にその位置が分かっている状況などどれほどあるというのか
2019/12/01(日) 12:32:06.35ID:p3Z7Nr0h
>>398
使いどころがわからないなら無理して使わなくて良いんだよ
2019/12/01(日) 12:33:53.83ID:SqfEoEmM
>>399
具体例を示そうね
2019/12/01(日) 12:34:14.31ID:p3Z7Nr0h
>>397
10%の高速化なら無視すればいいけど
1000倍とかなら考えるだろ?
vectorとlistとsetの選択を間違えると
そのくらいの差が出る
データ数が多ければ
2019/12/01(日) 12:41:44.01ID:IheeS71f
ソートが早い
403デフォルトの名無しさん
垢版 |
2019/12/01(日) 12:47:37.78ID:gHT6E7kc
イテレータの安定性が。
2019/12/01(日) 12:53:47.75ID:ZEhocPVE
>>397
最速のものを使う必要はないがそもそもアルゴリズムオーダーが間違ってるようなものを
使うってのは頭悪すぎるし、なぜc++使ってんの?バカなの?ファッション?
って気にしかならん。
2019/12/01(日) 12:57:04.85ID:7fh/nHBZ
「そんなもん使う」なんて全面否定しといて
今さらアルゴリズムオーダーとか言い出すのは見苦しい
406デフォルトの名無しさん
垢版 |
2019/12/01(日) 12:58:17.95ID:gHT6E7kc
木とグラフが足りないと思います。
2019/12/01(日) 12:58:25.43ID:n5DjgtsH
イニシャルコストとランニングコストがあるだろ
数か月〜数年間止まらないようなソフトウェアだと初回起動時のデータ読み込み10億件・数分程度は誤差で済む
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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