C++相談室 part154

■ このスレッドは過去ログ倉庫に格納されています
2021/01/08(金) 17:54:00.55ID:0DW9z0rL
※前スレ
C++相談室 part153
https://mevius.5ch.net/test/read.cgi/tech/1602339500/

テンプレここまで
2021/01/31(日) 17:15:05.39ID:ZnRwde8F
>>380
「All identifiers that begin with an underscore are always reserved
 for use as identifiers with file scope in both the ordinary and
 tag name spaces.」
「file scopeを持つ識別子として使用されるために予約されている」
だべ?
block scopeを持つ識別子として使用されたら、話がおかしいと思うが。

「この自動車は、仕事で使うために予約されています」
の場合、その自動車を私用で使えば、規則違反だよね。
2021/01/31(日) 17:15:45.54ID:fCVb5Gn/
int _x; //こんなのがあっても
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); } //ブロックスコープで保護されるだろうが
2021/01/31(日) 17:19:07.49ID:ZnRwde8F
>>382
でも、_ が最初に来る名前をアプリが使っちゃいけない、というのは伝統的にそういう
ことが一番の目的だと思うぞ。
もう一つは、コンパイラの内部でこっそり使う場合があって、それと知らないうちに
衝突する可能性が僅かにあるため。
なぜこっそり使うかと言うと、絶対に衝突しないようにコンパイラ側を
書こうとするとコンパイラ作りに手間がかかるから。
もし、アプリ側が命名規約を守ってくれていれば、コンパイラ作りが楽になる
ことがある。
2021/01/31(日) 17:20:06.45ID:ZnRwde8F
>>384
b(_y,_x)
と書いたらどうなるか考えてみたらしだんご。
2021/01/31(日) 17:25:17.52ID:fCVb5Gn/
>>385
おまえさんはコンパイラ屋か?
そうだとして同業者は__builtin_va_argのように注意深くやってるぞ
自分らのエゴのために客に制限をかけるようなことを
でかい声で叫びまくるのはやめてくれ
2021/01/31(日) 17:30:48.87ID:ZnRwde8F
>>387
まあ、本当はコンパイラ内部でこっそり使う場合、絶対に衝突しないような
もっと変な名前を使っているから大丈夫なんだ。
起動時の TickCounter の値を変数名の一部に入れたりとかね。
2021/01/31(日) 17:37:15.73ID:2WBeknRq
>>383
ローカルスコープで同じ名前の別変数を定義するのは「その自動車を私用で使う」ことには当たらないって言ってるの
390デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:42:24.07ID:/1NNOLNs
ヘッダーファイルに書くか、ソースファイルに書くかの違いも大きい。
ヘッダーファイルに書くときは名前衝突に対する細心の注意が必要。
2021/01/31(日) 17:45:15.36ID:fCVb5Gn/
>>386
{int _x=_y; int _y=_x; f(_x,_y); g(_x,_y); }
どうなるって言いたいんだ?
392デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:51:16.48ID:/1NNOLNs
C/C++の場合、スコープだけ意識するのは不十分で、ヘッダーかソースかで厳格さを変える柔軟性が必要。
ヘッダーに書くと影響範囲が大きいから。
2021/01/31(日) 17:57:13.23ID:fCVb5Gn/
テンプレートなんか普通にヘッダに内容全部を書くが
マクロでバカやるやつがいなければ平和だよ
2021/01/31(日) 17:58:49.95ID:A8yllSCF
ローカルスコープでも _x が禁止だというなら >>346 のマクロ a 定義内で _x を使っていい理屈もわからんよな。
395デフォルトの名無しさん
垢版 |
2021/01/31(日) 18:55:26.91ID:gXTMTlGe
std::pair<>を継承してquadを作る場合どうなりますか?
396デフォルトの名無しさん
垢版 |
2021/01/31(日) 18:58:05.19ID:gXTMTlGe
std::regexが意外と使える子に成長してますが、標準化委員会では捨て去る提案まで出てるそうで。
397デフォルトの名無しさん
垢版 |
2021/01/31(日) 19:37:14.68ID:/1NNOLNs
std::regexはプロパティが貧弱なので結局、従来の正規表現ライブラリ使う羽目になる。
std::regexと互換性のあるインターフェースを持つ正規表現クラスを提供するよう呼びかけるのが現実的。
2021/01/31(日) 19:51:04.44ID:vFnk+kXo
順序付き pair って自分で順番に格納するのと2要素のsetにするのどっちが良いですか
399デフォルトの名無しさん
垢版 |
2021/01/31(日) 20:39:53.24ID:/1NNOLNs
pairはSTLのアルゴリズムの恩恵を得るための物。
自宅の郵便受けを豪華にしたところで、郵便事業には何の関係もない。ただの趣味の世界。
2021/01/31(日) 21:08:09.18ID:vFnk+kXo
set< pear<int, int> > で、ある数を含む pear を高速に検索する方法ってある?
401デフォルトの名無しさん
垢版 |
2021/01/31(日) 21:47:36.00ID:jyYnHelr
set<int, vector<pair<int,int>*>>
元の集合に1億個程度のペアが入ってるとすると、住所録めいたものをあらかじめ生成しておく

配列でやっても速そう
list[m].empty()
こういうリストで空っぽかどうかわかればいいわけだ
vector<vector<pair<int,int>*>>>;

それならドでかい二次元配列に入れた方がラクかもしれない

連想配列でも出来る
map<int ,vector<pair<int,int>*>>>

静的な話だったが動的つまり追加と検索が交互に起こるとおそらく話は違ってくる

全部試して早かったモンが高速である、程度の他愛ない結論に落ち着く
2021/01/31(日) 22:01:19.63ID:gvpDZJRs
構造体にしろよバカども
読みにくいだろ
2021/01/31(日) 22:54:08.94ID:wKQ2AmTw
>>333
>>339
では _x ではなく x_ にしようっかな‥‥
2021/01/31(日) 23:01:41.96ID:eyFvwlDf
googleスタイルガイドはそちらを推してるな
2021/02/01(月) 01:17:42.16ID:FSry25xS
>>391
int _x=_y;
int _y=_x;
ここの二行目の右辺の_xは、b(_y,_x)の第二引数の_xではなく、一行目
で宣言した_xになっているので、b(_y,_x)の第一引数の_yになる。つまり、
int _x=引数の_y;
int _y=引数の_y;
となるので、{}の中の_x, _yは、どちらも引数の_yの値に等しくなってしまう。
これではマクロ作者が意図したことではなくなってしまう。
2021/02/01(月) 01:19:32.38ID:FSry25xS
>>394
まあ、それはもっともな指摘なのだが、アプリ本体では使用禁止で、
マクロでは使用可能と勝手に解釈してしまうのが一つの流儀。
2021/02/01(月) 01:22:56.68ID:FSry25xS
>>389
そうではなくて、ローカルスコープで使うことそのものが、file scope
で使ってないことに当たるので、規約違反と言うことになると解釈できる
気がするんだ。

なぜそんなルールにしたのかは分からんがな。
2021/02/01(月) 03:22:30.15ID:fw9rYrIy
>>405
残念だったね。インライン関数使おうね。

>>406
あなたの流儀を規格の定めであるかのように話すのは迷惑なのでやめてくださいね。

>>407
file scope で予約されてる名前を file scope で使ってないなら問題ないね。
規約違反などという解釈にはならない。気のせい。そんなルールになってない。ってことで終われよ。
2021/02/01(月) 07:01:58.51ID:v6ebtUL1
>>400
unordered_map<int, int>
2021/02/01(月) 07:30:17.18ID:LhepLs74
>>406
マクロ定義内の仮引数名は当のマクロ定義外の何者とも関係しないのでは…
いわゆる束縛変数
2021/02/01(月) 07:38:30.21ID:LhepLs74
として安全に取り扱われる

一方>>346の_xはa(x)が展開された結果が他のプリプロセッサ定義で再置換され得るなら危険
これが起きるかはプリプロセッサの仕様(規格)を見たら白黒付くが
個人的には君子なので危うきには近づかないことに死体、
2021/02/01(月) 08:09:47.67ID:v6ebtUL1
うちの若いのがあんなアホマクロ書いてたら張っ倒す
まあ、やらかしそうなのはいないけど
2021/02/01(月) 09:26:53.82ID:5yr9aQzL
>>346
そもそもそのマクロで生成される変数はファイルスコープでないから、そもそも問題外では?

仮にファイルスコープな変数を宣言するようなマクロでも、ユーザが意図せず
2021/02/01(月) 11:43:32.41ID:xFB8fPis
仕事に情熱が持てなくなった
2021/02/01(月) 11:43:38.91ID:VhfMLcQM
>>346
アホだ
416デフォルトの名無しさん
垢版 |
2021/02/01(月) 12:06:54.06ID:ZelzH3+k
>>414
コロナの影響だろな。
福島大爆発の影響も計り知れない。
「原爆ぶらぶら病」で検索してください。
417デフォルトの名無しさん
垢版 |
2021/02/01(月) 12:30:15.68ID:jyRtFT93
>>408
>file scope で予約されてる名前を file scope で使ってないなら問題ないね。
そうじゃない。
英語原文を読めば、file scopeで予約されているのではなく、file scopeで
使用するために予約されているのだ。
だから、file scope以外で使用することが禁止されている。
2021/02/01(月) 12:32:18.30ID:jyRtFT93
>>417
日本語で言うなら、「file scope 専用」。
2021/02/01(月) 12:46:40.95ID:/T40sBmV
>>414
ちゃんと飯を食え。
週末はちゃんち休め。

年10日は連続した休暇をとれ
2021/02/01(月) 12:55:04.41ID:ioMwojjO
>>417
その一文ばっかりやたらこだわるけど
これが属しているセクションの名前って「17.4.3.1.2 Global names」なんだわ
グローバル名前空間の名前以外については言及してないの
ドラフトならインターネットで無料で見られるんだからこの辺の全容見てきな?
2021/02/01(月) 13:14:13.18ID:Z79JHlVc
>>417
あらゆる場所で使ってはいけないのなら、7.1.3でわざわざ1つ目と対比させるように使用用途を限定して記載した理由を説明してよ。
普通はコンパイラ実装者のために予約されている、だけで十分でしょ
422デフォルトの名無しさん
垢版 |
2021/02/01(月) 13:45:48.95ID:fos4FOVO
仕事に情熱が持てなくなった
2021/02/01(月) 13:50:50.97ID:jyRtFT93
https://www.learncpp.com/cpp-tutorial/keywords-and-naming-identifiers/comment-page-2/

Second, you should avoid naming your identifiers starting with an underscore, as these names are typically reserved for OS, library, and/or compiler use.
424デフォルトの名無しさん
垢版 |
2021/02/01(月) 14:08:01.06ID:fos4FOVO
>>373
obj& operator [] (int i) {return elem[i];}
もちろんelem[]の定義はobj elem[];
obj.shape() も実装すると便利
425デフォルトの名無しさん
垢版 |
2021/02/01(月) 14:13:00.08ID:fos4FOVO
>>416
「コロナでゴロゴロ病」
2021/02/01(月) 15:47:43.70ID:Z79JHlVc
>>423
そのサイトを紹介して何の証明になるの?
427デフォルトの名無しさん
垢版 |
2021/02/01(月) 16:16:30.24ID:ZelzH3+k
>>426
https://isocpp.org/
428デフォルトの名無しさん
垢版 |
2021/02/01(月) 16:22:14.79ID:ZelzH3+k
C++ is the only real language for expert developers.
429デフォルトの名無しさん
垢版 |
2021/02/01(月) 16:55:19.50ID:fos4FOVO
C/C++は好きだし比較的最強の部類だと思うけど
夢未過ぎは判断を誤るから色んな言語を適材適所に使えるようになるのが理想
2021/02/01(月) 17:40:26.58ID:LhepLs74
システム記述言語はアセンブラを除けばこの世にCとC++とRustしか、
431デフォルトの名無しさん
垢版 |
2021/02/01(月) 17:46:42.82ID:ZelzH3+k
中国人のありがたいお言葉ですぞ。
2021/02/01(月) 18:02:36.06ID:jyRtFT93
大体、この板には中国人や韓国人はほとんど来ず、来ているのはアメリカ人
やヨーロッパやアフリカが多いらしい。
2021/02/01(月) 18:44:36.44ID:+21BJdPm
いやrustが最強でしょww
2021/02/01(月) 18:47:23.23ID:CDWd/LQ7
Goは駄目なん?
2021/02/01(月) 18:57:50.94ID:0s4gr52A
自作の構造体をsetに入れたいときって operator < さえ定義しとけば良いの?
eraseとかは全部のメンバが同じものを見つけて消してくれると思って良い?
436デフォルトの名無しさん
垢版 |
2021/02/01(月) 21:08:59.66ID:ZelzH3+k
検索するとひろみをお勧めしてくる時点で無理だった。
437デフォルトの名無しさん
垢版 |
2021/02/01(月) 21:34:17.50ID:ZelzH3+k
しかもチップも取るんかーい!
2021/02/01(月) 22:43:42.23ID:CtNYZU7D
>>435
erase含め、同値性は!(a<b)&&!(b<a)で判定される
全メンバ一致で同値とみなしたいなら辞書順比較する比較関数を定義すればよし
2021/02/01(月) 22:46:24.33ID:FbSt8IWH
演算子オーバーロードは地雷度高い。
2021/02/01(月) 22:53:14.56ID:CtNYZU7D
まあ、setに入れるためだけなら演算子オーバーロードするより関数オブジェクト使う方がいいかね
2021/02/01(月) 23:03:45.93ID:f9q1oLiO
C++の質問じゃないとは思うんですが、上位数ビットを0で埋めたいといった場合は
「0埋めしたいビットを0、他を1にしたもので&演算する」
であってますか?
442デフォルトの名無しさん
垢版 |
2021/02/01(月) 23:11:37.27ID:ZelzH3+k
合ってます。
2021/02/01(月) 23:17:45.03ID:f9q1oLiO
>>442
ありがとうございます
今までは例えばQWORDの上位3バイトを0埋めしたいってとき(value << 3*8) >> 3*8って言う2命令使う馬鹿な方法でやっていました・・・
444デフォルトの名無しさん
垢版 |
2021/02/02(火) 02:08:00.00ID:DmcXRB7X
へ椅子ブックが少し綺麗になってます。
445デフォルトの名無しさん
垢版 |
2021/02/02(火) 02:10:27.05ID:DmcXRB7X
RedditのC++コミュは17万人、オンラインが500人以上。
凄いね。
2021/02/02(火) 10:17:10.33ID:uFATDe77
ビット演算の中で最速なのってシフトじゃなかったっけ?
だから下手したら>>443の方がフェムト秒レベルでは微妙に早いんじゃない?
2021/02/02(火) 10:29:21.33ID:kGc73xZq
命令語長がマスク分だけでもQWORDに対して、シフトなら1バイト程度か
2021/02/02(火) 12:37:23.36ID:vWAdhQ36
>>446
CPUの世代やアーキテクチャによって違うが、
Latencyが、Shiftの方がandより少し遅いことがある。
2021/02/02(火) 12:49:48.88ID:+MtixY9O
>>434
Go は GC が前提にあるから少し制約が強いけども、
OS のカーネルを書くのでもない限り思ったより足かせにならないという評価はあるみたいだね。
2021/02/02(火) 13:08:50.07ID:aIAA0dxH
Goはクソすぎるから駄目だ
何が駄目といってまず名前が駄目
2021/02/02(火) 13:45:57.34ID:8HFbTrXI
GoはPC初心者用
昔でいういわばBASIC
2021/02/02(火) 18:03:08.15ID:FSwj4KRK
バレルシフタと単純ゲート
レイテンシも糞もねえだろ
2021/02/02(火) 18:11:36.53ID:8HFbTrXI
でもその縛りプレイが大好きな変人も居る
2021/02/02(火) 22:23:15.74ID:likaPPB8
operator ==も定義しておくとなお良い
==のために<が2回呼ばれるのもアホらしいと感じるはず…
結局std::rel_opsを使って全部定義するという結論に落ち着く
2021/02/02(火) 22:25:04.30ID:likaPPB8
インテルのやつはバレルシフタじゃない気配がする…
シフト結果をテーブル化した方が速かったことg
2021/02/02(火) 22:28:35.48ID:likaPPB8
あるいは最大限バレルシフタにしようとしているがパイプライン1段に収まっていないだけかもしれん…
2021/02/03(水) 00:25:34.21ID:p0NvFN6a
>>443
gcc, clang, msvc で最適化最大で試してみたら and をとるように最適化されたぞ。
主要コンパイラがそのように最適化するということは (前後の状況によるかもしれないけど)
たぶん and のほうが効率的ってことなんだろう。
458デフォルトの名無しさん
垢版 |
2021/02/03(水) 00:38:50.10ID:53EFMpkm
ビットシフトは64bit整数でのコンパイラ解釈が信用できないからAND演算子使うのが確実だと思うけどどうかな。
2021/02/03(水) 00:51:08.70ID:5b6XJ+8s
>>458
落ち着いてよく考えてみよう
お前がC++で作った成果物のうち、お前自身が書いたコードの割合なんてごくごく僅かに過ぎない
仮にそんなレベルで互換性が当てにならないような環境があったとして、お前が直接書いていない他の99%のコードがまともに動くと本気で思うか?
2021/02/03(水) 00:54:51.58ID:p0NvFN6a
0xffffffffff とか書いてたら桁数を正しく書けてるか不安になる……

今の C++ だと桁区切りも入れられるけど、
どう入れたら意図がわかりやすいかようわからんし、
シフトで表現するのもありな選択だと思う。
2021/02/03(水) 01:01:02.57ID:+m9V7fCu
>>458
具体例をお願いできますか?
462デフォルトの名無しさん
垢版 |
2021/02/03(水) 01:20:23.24ID:53EFMpkm
コンパイラがちゃんと32bit整数への丸め警告を出してくれるならいいが、しれっとコンパイルされたらお手上げ。
2021/02/03(水) 02:47:38.99ID:+m9V7fCu
>>462
丸めって暗黙の型変換のことですか?
シフト演算は特に関係しないと思いますが……
2021/02/03(水) 06:01:31.58ID:QcjMAifW
>>460
0x0000'ffffull
2021/02/03(水) 06:29:42.77ID:y3dS6mbz
unsigned long long x = (0x1ULL << 32) - 1ULL;
ならちゃんと動く(と思う)が
unsigned long long x = (0x1 << 32) - 1;
とかだとイマイチ不安が…
2021/02/03(水) 06:38:54.06ID:Nl+WsQpo
>>465
下の方はイコールの右辺にintしか出てこないのだから、intが32bitの環境なら32bitでしか計算されないだろう
467デフォルトの名無しさん
垢版 |
2021/02/03(水) 10:23:38.02ID:q8Ed7guF
丸めと暗黙の型変換は違うものでは?
2021/02/03(水) 11:47:09.95ID:HtH84Poo
丸めや打ち切りは浮動小数点数の概念やね
469デフォルトの名無しさん
垢版 |
2021/02/03(水) 13:02:19.58ID:53EFMpkm
ビットシフト記述は自然すぎてソースコードに埋もれてしまう。
64ビットマスクのAND記述は見た目がどぎついので、かえって人間の注意を引くことができる。
2021/02/03(水) 14:45:43.48ID:J722wycU
なにいってんだこいつ
2021/02/03(水) 15:50:32.48ID:pE1foWCw
>>465
やっぱり、32BITの時が一番プログラミングし易かったな。
64BITになると、64BITと32BITを区別して書く必要が出てきて、
書くのが面倒になった。
2021/02/03(水) 19:12:23.88ID:XaYGR0Wv
そう?ポインタサイズくらいしか違いなくない?
473デフォルトの名無しさん
垢版 |
2021/02/03(水) 21:29:02.90ID:53EFMpkm
まじめにC/C++標準型size_tを使っている人には32bitと64bitの処理切り分けが地味に辛い。
2021/02/03(水) 22:36:28.54ID:y3dS6mbz
>>465の下の方のやつは符号拡張されたりする気がするorz
2021/02/03(水) 22:40:25.83ID:Ea4RwHR/
>>424
> obj& operator [] (int i) {return elem[i];}
> もちろんelem[]の定義はobj elem[];

objは行列クラスで、elemはobjのメンバで行列要素を格納する一次元配列、で合ってますよね?
class obj{
 array<int, ?> elem;
public:
 obj& operator [] (int i) {return elem[i];}
};
ということですか?
2021/02/04(木) 03:22:45.38ID:R0EDVzG0
>>473
size_t は、型名が長いし _ も含んでいるし、打つのが辛い。
それにコードに締める長さも長くなるので画面が狭くなるし。
2021/02/04(木) 04:17:06.60ID:SkZt7jTc
>>473
まじめに、て別にsize_t使ってたら偉いわけじゃない
サイズを表したいけどいちいち考えたくない場合の選択肢だぞ
2021/02/04(木) 11:32:06.33ID:sIhIIpMX
size_t型はSTLを使う人なら避けて通れない。
479デフォルトの名無しさん
垢版 |
2021/02/04(木) 11:40:48.70ID:ZzRKCYY/
>>471
それ本来そこにあった問題に気付いていないだけだったと思うぞ
480デフォルトの名無しさん
垢版 |
2021/02/04(木) 11:44:02.03ID:ZzRKCYY/
>>475
class obj{
 array<obj, ?> elem;
public:
 obj& operator [] (int i) {return elem[i];}
};
2021/02/04(木) 12:06:17.02ID:DWE1XJjK
>>480
それってarrayのarrayとかvectorのvectorとか配列の配列として行列を作るのと同じですよね?
一次元配列に要素を格納しておいて[][]でアクセスするのは不可能なんでしょうか
row majorやcolumn majorを自由にできる、等の理由でそちらの方が好ましいのですが
2021/02/04(木) 12:29:12.61ID:waKgX41w
一次元配列を内包しているクラスのoperator[](int y)が、下記のようなクラスを返すようにすればできる。

class Row {
vector<int>& 一次元配列への参照
int 列数
int y
int& operator[](int x){ return 一次元配列への参照[列数*y+x]; }
};


でも自分ならoperator[]は使わずもとのクラスにindex(x, y)みたいな関数を用意して対処すると思う。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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