2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part162

1 :sage :2022/10/31(月) 14:29:35.57 ID:J5sgTSch0.net
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part161
https://mevius.5ch.net/test/read.cgi/tech/1653135809/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

2 :デフォルトの名無しさん :2022/10/31(月) 17:11:42.28 ID:FSs0hrWX0.net
保守です

3 :デフォルトの名無しさん :2022/11/01(火) 07:31:00.75 ID:8mAHYLmxd.net
寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末食う寝る処に住む処藪ら柑子の藪柑子パイポパイポ パイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナーの長久命の長助

4 :デフォルトの名無しさん :2022/11/01(火) 12:22:19.23 ID:LNKvo44sd.net
今更話すことある?

5 :デフォルトの名無しさん :2022/11/03(木) 09:15:40.37 ID:AvIGv7Uk0.net
template <template<class...> class T>
struct is_map : std::false_type { };

template<> struct is_map<std::map> : std::true_type { };
template<> struct is_map<std::multimap> : std::true_type { };
template<> struct is_map<std::unordered_map> : std::true_type { };
template<> struct is_map<std::unordered_multimap> : std::true_type { };

template <template<class...> class T>
concept map_t = is_map<T>::value;

template <template<class...> map_t MAP, class... ARGS> //C3339
void test(MAP<ARGS...>&&) {}

うーん、困った
どうしよう。。。

6 :デフォルトの名無しさん :2022/11/03(木) 10:13:40.98 ID:GMyBvZ220.net
requires map_t<MAP>でええやん

7 :デフォルトの名無しさん :2022/11/03(木) 10:30:49.88 ID:AvIGv7Uk0.net
あ、そっか
㌧x

一応、報告
template <template<class...> class MAP, class... ARGS> requires map_t<MAP> //OK
void test(MAP<ARGS...>&&) {}

8 :デフォルトの名無しさん :2022/11/03(木) 18:33:03.71 ID:A3AnwOcy0.net
テンプレートにテンプレート重ねて滅茶苦茶する典型

9 :デフォルトの名無しさん :2022/11/03(木) 20:41:25.83 ID:GMyBvZ220.net
AssociativeContainer要件のコンセプトは標準ライブラリには無いんだな
規格上定義してるrequirementは一通り作っとけばいいのに

10 :デフォルトの名無しさん :2022/11/03(木) 22:05:17.66 ID:f0rgVbxY0.net
>>8
でも文法的コンパイラ的には許されている
100段くらい重ねて大丈夫なんじゃなかろうか

11 :はちみつ餃子 :2022/11/03(木) 22:28:39.04 ID:b1nVlp4p0.net
>>10
コンパイラが無限のリソースを使えるわけじゃないから制限があってもいいし、
わかっている制限は文書化するべきということになっている。
https://timsong-cpp.github.io/cppwp/n3337/implimits

言語仕様の側でもどの程度まで処理すべきかという最低限の数値は与えていて
この場合だと
Recursively nested template instantiations [1024].
ってのが当てはまる。
あくまでもガイドラインなのでこれ以下に制限された処理系がないとは言えないんだけど、
1024 が提示されているところで 100 やそこらに制限するような処理系はたぶんあんまりないとは期待できると思う。

12 :デフォルトの名無しさん :2022/11/04(金) 14:22:03.44 ID:MccBwaps0.net
そんなん言い出したら自動変数は合計何バイトまでとか
しょーもないことを規格票に書くハメにならないか?

13 :デフォルトの名無しさん (ワッチョイ 8901-T+yX):2022/11/04(金) 14:28:53.41 ID:I5Ua2kB10.net
GCCとClangの -ftemplate-depth-?? の話?

14 :デフォルトの名無しさん (スッップ Sd33-pLSs):2022/11/04(金) 15:45:10.91 ID:nV9i8Ccmd.net
昔は17だったなその制限

15 :デフォルトの名無しさん :2022/11/04(金) 16:29:55.40 ID:MccBwaps0.net
つーかよ
俺5だけど、あの程度のことで
8みたいなこと言われたのずっこけてる

別に無駄に複雑化はしてないし裏技も使ってない
当たり前の書き方で目的を素直に書いてるだけなのに

一次テンプレートと特殊化でis_系のクエリーを作って
それでコンセプト作って使おうとしただけだぜ?
何があかんの?

テンプレートテンプレート仮引数がわからんだけじゃないのかって邪推しちまいそう

16 :デフォルトの名無しさん :2022/11/04(金) 16:49:46.97 ID:nV9i8Ccmd.net
全然あかんくないと思うよ
8がアホなだけ

17 :デフォルトの名無しさん :2022/11/04(金) 18:04:41.45 ID:I5Ua2kB10.net
話は綺麗に終わってるのに
発展的に関連した話題を振るのならともかく
何で>>8みたいなコメントをいちいち付けるのか俺も理解不能

18 :デフォルトの名無しさん :2022/11/04(金) 18:07:42.31 ID:I5Ua2kB10.net
>>14
そうそう昔はこれを付けないで17超えるとエラーが出てた
-ftemplate-depth-100 くらいで使ってたけど
いまはデフォルトで1024になってるのね

19 :はちみつ餃子 :2022/11/04(金) 19:44:51.78 ID:lXYNWX4U0.net
制限はあくまでも「深さ」であって「回数」ではないので上手いこと変形するのも技の内だったんだよな……。
遊びでやるならきつめの制限も楽しいんだけどね。

20 :デフォルトの名無しさん :2022/11/05(土) 15:23:46.47 ID:6woT7hPv0.net
自動的に解釈されるテンプレート引数で
値渡しじゃなく参照渡しと解釈させる方法ってありますかね?

21 :デフォルトの名無しさん :2022/11/05(土) 15:33:58.60 ID:95t5abQGd.net
std::ref
std::cref

22 :デフォルトの名無しさん :2022/11/05(土) 15:40:28.55 ID:6woT7hPv0.net
あるんですねぇ
ありがとうございます

23 :デフォルトの名無しさん :2022/11/07(月) 14:57:30.80 ID:8LbwGvMzM.net
明示的な型変換が可能か調べる方法ってありますか?
暗黙的ならis_convertibleが使えるのですが…

std::is_convertible<std::shared_ptr<void>, bool>::value; // trueになってほしい

24 :デフォルトの名無しさん :2022/11/07(月) 16:58:07.91 ID:2UaeFBkad.net
is_constructibleを使う

25 :デフォルトの名無しさん :2022/11/07(月) 17:32:26.98 ID:unROdsfFM.net
>>23
std::is_constructible<bool, std::shared_ptr<void>>::value

ありがとうございました。

26 :デフォルトの名無しさん :2022/11/07(月) 17:32:50.90 ID:unROdsfFM.net
>>24
ありがとうございました。

27 :デフォルトの名無しさん :2022/11/09(水) 10:37:27.83 ID:uQIa4jnTp.net
質問です
マネージドとかアンマネージドとかMSの呪いですか?

28 :デフォルトの名無しさん :2022/11/09(水) 11:23:16.37 ID:GzNJb2MKM.net
プログラミング言語 C++ [第四版]
BJARNE STROUSTRUP, 柴田望洋 訳
「第四章 C++を探検しよう:コンテナとアルゴリズム」のp.102-103
に以下の様なコードが有るのですが、phone_book = の右側の初期化子(?)
の部分をコンパイラ内部でどのように翻訳(解釈)していくのかの厳密な詳細が
分かりませんので、どなたか教えてもらえませんか。
struct Entry {
 string name;
 int number;
};
vector<Entty> phone_book = {
 {"David Hyme",123456},
 {"Karl Popper",234567},
 {"Bertrand Arthur William Russell",2345678}
};
前提として、クラステンプレート vector<T> には、以下のような
「初期化子並びコンストラクタ」があることとします。
template <class T, class Alloc = allocator<T>>
class vector {
・・・
 // 初期化子並びコンストラクタ :
 vector( std::initializer_list<T> a );
・・・
}
ここで問題となるのは、以下のどちらの方法で解釈されているかということです。
[続く]

29 :デフォルトの名無しさん :2022/11/09(水) 11:24:30.65 ID:GzNJb2MKM.net
>>28
[続き]
(1) {・・・}を翻訳した後に、コンストラクタを探す。

phone_book = の右側の部分は、コンパイラ内部で、いったん
std::initializer_list<UUU>型のオブジェクトに直される
(なお、UUU がどんな型かは不明)。
vector<Entry>クラスの中にたまたま「初期化子並びコンストラクタ」
vector( std::initializer_list<Entry> )を見つけて
initializer_list<UUU>をinitializer_list<Entry>に変換してから、
vector( std::initializer_list<Entry> )に渡す。

(2) コンストラクタを見つけた後に、{・・・}を翻訳する。

vector<Entty>クラスの中にコンストラクタを探して、
vector( std::initializer_list<Entry> ) があることを発見。
このコンストラクタの引数が、std::initializer_list<Entry>であることから、
phone_book = の右側の部分を、std::initializer_list<Entry> だと
思って、コンパイル(意味論的に解釈)する。

# 推定ですが、(1)だと上手く行かない気がします。
[続く]

30 :デフォルトの名無しさん :2022/11/09(水) 11:25:24.81 ID:GzNJb2MKM.net
>>29
[続き]
[自分なりに調べたこと]
[A] p.293. 11.3 「並び」によれば、
{}構文は、名前付き変数を初期化する(§6.3.5.2)だけでなく、
(すべてではないものの)多くの箇所で式として利用できる。その構文は、
以下の二種類だ:
[1] T{...}:型で修飾された形式。"T型のオブジェクトを作成してT{...}で初期化
する"ことを意味する。§11.3.2。
[2] {...}: 型で修飾されていない形式。利用している文脈に基いて型を
決定できる必要がある。§11.3.3。
# auto以外では{}内の要素の型は推論に利用「されない」」らしい。p.297

[B] p.327によると、
「{}で囲んだ並びは、以下のものに対する引数として利用できる:
[1] std::initializer_list<T>型。並びの中の要素の値は、
  暗黙理にTへと変換される。
[2] 並びの中に与えられている値で初期化可能な型
[3] Tの配列への参照。並びの中の要素の値は、暗黙裡にTへと変換される。

31 :デフォルトの名無しさん :2022/11/09(水) 16:50:18.10 ID:XEaxVtCg0.net
大体わかってそうだけど
{…}をinitializer_list<Entry>として解釈しようと試みる→中身の{"David Hyme",123456}とかをEntry型に暗黙変換しようと試みる→全部変換できれば成功
Entryがexplicit Entry(string, int);を持ってると暗黙変換できなくて失敗するようになる

32 :デフォルトの名無しさん :2022/11/10(木) 00:59:56.86 ID:8S99EFBAM.net
>>31
vector<T>クラスのコンストラクタに、initializer_list<T> 以外の引数を
持つものが存在していた場合、どういう優先順位でコンストラクタが選ばれて
いくのでしょうか。
コンパイラは、最初に初期化子の {・・・} の部分のカンマで区切られた中身の
個数を数えてから、その個数によってどのコンストラクタを選ぶかを決めますか?

33 :デフォルトの名無しさん :2022/11/10(木) 01:07:30.02 ID:8S99EFBAM.net
>>32
仮にそうだとすると、コンパイラの内部では、
1. vector<Entty> phone_book の宣言の型である vector<Entty>を把握。
2. = の右側の初期化子の部分の{}の中の個数など大まかな特徴を掴む。
3. 2の特徴に基いて最適なvector<Entry>のコンストラクタを探す。
4. = の右側の部分を3.のコンストラクタに基いて解釈/変換する。
という少なくとも4段階の工程を得ていることになりそうですが、随分と
特殊な解釈の仕方ですね。
通常の式ならば、このように「いったりきたり」はしないものですが。

34 :デフォルトの名無しさん :2022/11/10(木) 07:25:48.25 ID:JLZuLXt50.net
そこは通常のオーバーロード解決と同じだけど何が気に食わないの?
f(int)とf(int,int)があってf(1,2)を解決するときに「先に引数が2個あることをチェックするなんてインチキだ!」って発狂されても

35 :デフォルトの名無しさん :2022/11/10(木) 12:27:18.30 ID:Ma0XsUW1M.net
>>34
しかし、その場合、どの関数を呼び出すかが決定されてから後に、パラメータ(実引数)
の意味解釈は変化せず、実引数の解釈は同じで、必要あらば関数の仮引数へとcastされるだけです。
ところが、今回の初期化子の場合は、実引数の大体の様子が調査された後に、
どのコンストラクタを使うかが決定。コンストラクタが決定された後に、実引数の
意味解釈まで変わります。

36 :デフォルトの名無しさん :2022/11/10(木) 12:30:32.91 ID:Ma0XsUW1M.net
>>35
[補足]
前半の通常の関数の場合、コンパイラの内部で隠れてcastされるという訳ではなく、
必要あらばちゃんとcastに必要な「変換関数」が呼び出されることまで決まって
おり、マシン語レベルで変換関数を呼び出だすcall文が生成され、その中で
変換に必要なマシン語の列が実行されます。
ところが、後半の初期化子の場合、その変換関数が呼び出されない可能性が高い
です。なぜなら、変換ではなく、最初からのコンストとラクタの仮引数の
型に合わせて意味解釈されて、いきなりその型としてコンパイルされるためです。

37 :デフォルトの名無しさん :2022/11/10(木) 12:33:49.93 ID:Ma0XsUW1M.net
>>36
[補足2]
気に食わないのではなく、不規則変化というか、C++の一般法則とは異なる
法則が流れているようで、難しいな、と思ったまでです。

38 :デフォルトの名無しさん :2022/11/10(木) 12:36:36.70 ID:43j6CzLZF.net
これvector<Entry>に
std::array<Entry,3>とか
std::tuple<std::pair<const char*, int>, std::pair<const char*, int>, std::pair<const char*, int>>
とか受け取るコンストラクタが追加されてたらまた話変わったりするよね

一応全部合法的に受け取れるはずだから、
コンパイラはどう解決するべきかってのを >>28 は聞きたいんだと思う

39 :デフォルトの名無しさん :2022/11/10(木) 12:40:22.21 ID:IDnNuz1Ud.net
なんか書き込んでからどっちもコンパイル通らないような気がしてきた
忘れてくれ

40 :デフォルトの名無しさん :2022/11/10(木) 13:04:32.16 ID:kKaeKygLd.net
>>38
その場合は曖昧だって怒られるだけ

41 :デフォルトの名無しさん :2022/11/10(木) 13:24:31.23 ID:WlLaCVUwd.net
初期化子をコンストラクタのオーバーロード候補(静的に決まる)にそれぞれ適合させてみて、どれもダメならエラー、複数当てはまるなら優先度に従って1個に絞れたらそれを選択、曖昧ならエラー

初期化子や優先度の複雑怪奇なルール詳細の事ならともかく、この大枠の話の何がそんなに原則外れで難しいと思ってるのか正直さっぱりわからない

42 :デフォルトの名無しさん :2022/11/10(木) 13:24:55.21 ID:Ma0XsUW1M.net
>>37
[補足4]
fという名前だが仮引数の型が異なる持つ関数f()が複数ある場合は、
f(a);
と書いた場合、aの部分が完全に意味解釈されて、aの型が完全に決まってから、
どのf()が呼び出されるかを選択。
選択されたf()の仮引数の型Tと実引数aの型を比較して、異なっていれば、
aの型をTに変換する変換関数を呼び出し、変換後の値を関数f()の引数として
関数f()を呼び出す。

ところが、初期化子の場合、
T v = b;
と書くと、bの型を軽く調査するが、完全には b が意味解釈される前にどの T のコンストラクタ
を呼び出すべきかの調査が始まる。その時点では、bの型は完全には決まってない。

43 :デフォルトの名無しさん :2022/11/10(木) 13:28:29.70 ID:Ma0XsUW1M.net
>>41
>初期化子をコンストラクタのオーバーロード候補(静的に決まる)にそれぞれ適合させてみて、どれもダメならエラー、複数当てはまるなら優先度に従って1個に絞れたらそれを選択、曖昧ならエラー
Tのどのコンストラクタを使うかが決まるまでは、初期化子の中身の型が決まりません。
なので、総当り的にチェックすることが不可能だということになります。
(原因と結果が逆なので)。
なお、Tのどのコンストラクタを使うかを決める際に、初期化子のある程度の様子は
必要になりますのでややこしくなっています。

44 :デフォルトの名無しさん :2022/11/10(木) 14:13:26.85 ID:99QPf7Vaa.net
>>36
関数だって定数(もしくは定数になる式)渡したら変換関数なんか呼ばずに変換後の値を渡すようにコンパイルするだろ

45 :デフォルトの名無しさん :2022/11/10(木) 15:49:32.45 ID:kY0Aveh/d.net
>>43
型が決まらないって何のこっちゃ
君の例だと"David Hyme"はconst char*だし123456はintだし、
{"David Hyme",123456}はEntry(に集成体初期化で暗黙変換可能)で、他の要素も全部そうだから初期化子全体はinitializer_list<Entry>(に暗黙変換可能)なのでvector(initializer_list<Entry>)が適合可能、って全部静的に決まる話だぞ(正確にはもっとややこしいけど)
どこに動的型が出てくると思った?

46 :デフォルトの名無しさん :2022/11/10(木) 21:41:21.36 ID:lrIHTbD+0.net
自分の認識と実際の動作の間に食い違いがあることを質問したのに
その認識の間違いを指摘されても認めたくない人って厄介だね。

47 :デフォルトの名無しさん :2022/11/10(木) 21:44:22.55 ID:xu9+brpFp.net
プログラムは書いた通りにしか動かない

って奴だな

48 :デフォルトの名無しさん :2022/11/10(木) 21:59:32.65 ID:ycxEOHBI0.net
自分の認識の通りのコンパイラを作るってんならご自由にだが
そうでない以上認識を改める他なかろう

49 :デフォルトの名無しさん :2022/11/10(木) 22:00:55.26 ID:8bOle1Do0.net
依存性逆転の原則または依存関係逆転の原則

50 :デフォルトの名無しさん :2022/11/10(木) 22:21:23.00 ID:XJxScCwYM.net
>>45
動的な型のことは一切言及していません。
私のIQは170以上あるので、普通のプログラマには質問の意味が理解できてない可能性があります。

51 :デフォルトの名無しさん :2022/11/10(木) 22:22:55.08 ID:XJxScCwYM.net
2ch/5chでレベルが高い質問をすると、バッシングを受ける傾向が有ります。

52 :デフォルトの名無しさん :2022/11/10(木) 22:23:43.35 ID:xu9+brpFp.net
頭が良い人なら、馬鹿にも分かる説明も難なくこなすんだがなぁ
自称してるだけの馬鹿なら意味不明な話を相手の理解力のせいにするんだよなぁ

53 :デフォルトの名無しさん :2022/11/10(木) 22:25:12.06 ID:XJxScCwYM.net
>>45
例えば、class定義の中身Xが同じでも、class A {X} と class B {X} では別の型です。
その意味で、型が決まってないのです。
繰り返しますが、あなたはC言語の基礎が理解出来てないか、または、IQが
この質問に対して足りてない可能性があります。

54 :デフォルトの名無しさん :2022/11/10(木) 22:26:30.44 ID:XJxScCwYM.net
>>52
逆も有ります。
ちなみに、私は実世界で天才だと言われたことが何度も有ります。

55 :デフォルトの名無しさん :2022/11/10(木) 22:29:41.43 ID:XJxScCwYM.net
>>53
[補足]
{"aaa",1234}は、>>28のEntryとよく似た方では有りますが、コンパイラ内部では
Entryとは認識されません。仮に、
struct EntryB { const char *name, int number; };
とすれば、{"aaa",1234}は、中身の型としてはEntryBと全く同じと言えますが、
EntryBではないのです。
これが理解できないならば、C言語の基礎が理解出来てないので、質問の
意味が理解できないでしょう。

56 :デフォルトの名無しさん :2022/11/10(木) 22:34:40.81 ID:XJxScCwYM.net
なお、数学的な言葉に慣れてない人は私の質問が哲学的な抽象論の様に聞こえて
頭が悪い人が変なことをいっているように聞こえたかも知れません。

57 :デフォルトの名無しさん :2022/11/10(木) 23:38:43.51 ID:lrIHTbD+0.net
>>53
>例えば、class定義の中身Xが同じでも、class A {X} と class B {X} では別の型です。

nominal typing な世界ではたしかにAとBは別の型だが無名の{X}はAとBどちらにも一致する。

58 :デフォルトの名無しさん :2022/11/10(木) 23:56:40.35 ID:QHBEGLKOa.net
>>54
最近は体調どうよ

59 :デフォルトの名無しさん :2022/11/11(金) 00:01:29.20 ID:J8vKnsQy0.net
あー君が何を勘違いしてるのか分かってきた
「初期化子`{"aaa",1234}`の型」というものがあると勘違いしてるんだな
こいつは「const char*とintの要素が並んだ波括弧初期化子」であってこれ全体が型を持ってるわけじゃない
あくまで「Entryを初期化(暗黙変換)出来る初期化子」「EntryBを初期化出来る初期化子」でしかなくて、これ自体をEntryとかEntryBとかそのものだと思いこんでるのが君の根本的な間違いだ
(関数呼び出しfoo(1,2);の(1,2)だけ取り出してこの型は何だ?と聞いてるのと同じようなものでナンセンス)

初期化子の仕事はあくまで初期化なんだから、同じ文字列の初期化子でもその初期化対象の型(が許している初期化方法)によって意味は変わる
Entryのようにstringとintを持った構造体なら集成体初期化になるし、
(const char*, int)の引数を取るコンストラクタ(非explicit)の呼び出しにもなるし、
initializer_list<Foo>(Fooはconst char* とintの両方から暗黙変換できる型)にもなれる
なれるというか、初期化対象型のコンストラクタオーバーロードに対して一番適合するものを探し出す(無理ならエラーにする)のがコンパイラの仕事で、当然全部静的に決まるようになってる
こういう風に同じ波括弧にいろんな解釈方法を持たせることで初期化を柔軟に書けるようになってるわけだ(C++11で導入されたuniform initialization)


キチガイみたいだから優しく教えるのはこれで最後にする
すまんかったね

60 :デフォルトの名無しさん :2022/11/11(金) 00:16:31.96 ID:NMTpQElqM.net
>>59
型を持ってるわけじゃないのは当然なのに、あなたが「動的型」というこっちが
言ってないことを勝手に妄想しだしたので、基礎から解説したまでです。
こっちの方が圧倒的に頭がいいので、食い違うのです。

61 :デフォルトの名無しさん :2022/11/11(金) 00:17:28.31 ID:NMTpQElqM.net
馬鹿は自分が馬鹿だと気付かないんです。
質問の意味すら分かってないのに質問に答えようとしてくる。

62 :デフォルトの名無しさん :2022/11/11(金) 00:22:09.88 ID:NMTpQElqM.net
>>59
このような場合にC++では型が静的に決まるのは当たり前。
あなたこそ、動的言語を前提にしているように思える。
そういうことではなくて、コンパイラが内部でどのような順序で「静的に」翻訳作業を
行なっているかを質問している。
コンパイラ内部では型を持って無くても、構文ツリーや色々な形でデータを
持っているが、仕様では、その順序までも決まってないとコンパイラで非互換性が
出てきてしまうし、何より、C++では演算子のオーバーロードなども出来る訳
だから、コンパイラの内部的な解釈の順序まで厳密に仕様化されてなければ、
一般プログラマも混乱が生じる。
その事を聞いている。

63 :デフォルトの名無しさん :2022/11/11(金) 00:26:17.38 ID:NMTpQElqM.net
>>62
[補足]
JSなどの動的で初心者ならば、「大体」で理解していればそれで問題無い事が
多いだろうが、C++では、テンプレートもあればoperator+()演算子や型変換
演算子などをオーバーロードできるから、「大体」では駄目で、非常に細かな
コンパイルの順序や解釈の流れまでが言語の仕様書に厳密に書いてなければ
正しいアプリケーションコードを書くことが出来ないことがある。
「直感的に簡単に理解できるのに、何この馬鹿は聞いているんだ?」
などと思っているとすれば、大間違いだ。

64 :デフォルトの名無しさん :2022/11/11(金) 00:28:53.35 ID:L/uUC/Rw0.net
質問はしたのだから、回答を待っていればいいだろうに
何でまた独り言を延々と書いてるのか、不思議だ
書くなら自分の日記帳に書けばいいのでは

65 :デフォルトの名無しさん :2022/11/11(金) 00:32:42.01 ID:NMTpQElqM.net
>>63
[補足]
>>28で、phone_bookの初期化子について、「直感的に」理解できたら
それで十分、などと考えている人は、馬鹿なので質問には答えないで下さい。
C++コンパイラは、そのように大体で動作しているのではなく、パターン
に当てはめて順序を追ってコンパイルを進めていきますが、その順序や
解釈の仕方がC++03の時代とはかなり違っているように思えたから
質問したのです。
例えば、>>28は単なる例であって、これの応用として非常に複雑なコードを
書いた場合でも、コンパイラはなんたかの単純な法則に従って厳密に翻訳していきます。
その正確な規則が分からないから聞いているのです。

66 :デフォルトの名無しさん :2022/11/11(金) 00:33:22.29 ID:NMTpQElqM.net
>>64
馬鹿な人が茶々入れしてきたので、排除する努力をしています。

67 :デフォルトの名無しさん :2022/11/11(金) 00:40:51.17 ID:NMTpQElqM.net
>>59
>Entryのようにstringとintを持った構造体なら集成体初期化になるし、
今回の例では、vector<Entry>型の初期化ですので、そんな単純ではありません。
vector<T,A>テンプレートのコンストラクタが呼び出されるはずです。
しかも、コンストラクタの種類が沢山ありますから、それを選ばなくてはなりません。
Entry a = {"xxx",1234};
ならば集成体初期化ですから、コンストラクタを選ぶ工程は無いはずですから、
比較的単純です。
ところが、今回の場合は、コンストラクタの選択から始まります。
しかし、初期化子自体の型が中途半端な状態でコンストラクタを選ぶ必要が
ありそうなので質問しているのです。

C++03で、x+y書いた場合、xとyの型が決まった後で、operator+(U,T)演算子を探します。
ところが今回の場合、初期化子の部分の型が中途半端な状態なので、コンストラクタを探す
ための手がかりが中途半端にしかないのです。

68 :デフォルトの名無しさん :2022/11/11(金) 00:45:48.11 ID:NMTpQElqM.net
>>67
[補足]
CPerson person{"Suzuki", 25};
と書いた場合、CPersonのコンストラクタはすぐ探せます。
ところが、>>28 のように
vector<Entry> phone_book = {
 {"David Hyme",123456},
 {"Karl Popper",234567},
 {"Bertrand Arthur William Russell",2345678}
};
の場合、テンプレート vector<T,A> の中のコンストラクタを選ぼうとしても、
初期化子の{"David Hyme",123456}には、ある意味では「型が存在してない」ので
通常のように探すことは出来ないのです。

69 :デフォルトの名無しさん :2022/11/11(金) 00:48:44.75 ID:J8vKnsQy0.net
>>65
正確な規則が知りたいのに規格に当たることすら思いつかないのか自称天才のボンクラ様ってのは
9.4 Initializers [dcl.init](C++20公開ドラフトN4861、正規の規格がいいなら自分で買え)を見ればいいよ
誰でも読めば分かるように書いてある規格を天才様が理解できないなんてありえないから以降質問禁止な

70 :デフォルトの名無しさん :2022/11/11(金) 00:55:21.61 ID:NMTpQElqM.net
>>68
[補足]
vectorは配列と似ていますが、コンパイラの内部的にはかなり違う扱いになっていて、
Entry a[3] = {
 {"David Hyme",123456},
 {"Karl Popper",234567},
 {"Bertrand Arthur William Russell",2345678}
};
と書いたならば、コンパイルの翻訳過程は全く異なってきます。
この場合はとても単純で、
T a[N] = {XXX};
の形式は、配列初期化として特別処理されています。
なので、コンストラクタを探す工程、というものが必要ありません。
そして、{"David Hyme",123456} の型を知る必要も無く、単純に、
Entryのメンバに代入していくような処理となります。
この場合の処理は、まず最初に配列型として処理が入り、次にEntryの構造体型
としての処理が入ります。
これが理解できない人は質問には答えないで下さい。混乱の元になります。

71 :デフォルトの名無しさん :2022/11/11(金) 00:56:13.87 ID:NMTpQElqM.net
>>69
そんな言い方されれば質問サイトの意味が無いわけです。

72 :デフォルトの名無しさん :2022/11/11(金) 00:59:02.50 ID:J8vKnsQy0.net
>>68
あまりにも馬鹿すぎて哀れだからもう1回だけ助け舟出してやる
いいか?vector<Entry>がどんなコンストラクタ持ってるか(どうオーバーロードされてるか)は決まってんだよ
vectorテンプレートを実体化した時点で静的に全部決まってんだよ
馬鹿なお前だって<vector>ヘッダを隅々まで読めば列挙くらい出来るのは分かるだろ
vector<Entry>のコンストラクタは例えばvector<Entry>()とかvector<Entry>(size_type)とかvector<Entry>(vector<Entry>&&)とかvector<Entry>(initilaizer_list<Entry>)とか色々あるわけだな(全部は挙げんぞ)
コンパイラ様はまずそれを列挙するわけだ。そして
・vector<Entry>()かな?→空じゃないからダメ
・vector<Entry>(size_type)かな?→{...}はsize_typeに変換できるかな?→ダメ
・vector<Entry>(vector<Entry>&&)かな?→{...}はvector<Entry>&&に変換できるかな?→ダメ
・vector<Entry>(initilaizer_list<Entry>)かな?→{...}はinitilaizer_list<Entry>に変換できるかな?→OK!
・...
ってひたすら一つずつ試すわけだ。で、vector<Entry>(initilaizer_list<Entry>)しか当てはまるものがないので、じゃあこれだとオーバーロードを解決するわけだ
コンパイラのやってることなんて基本的にこれだけだ、実に単純な話だ
こんな単純なこともわからずグチグチグチグチとお前は本当に無能だな

73 :デフォルトの名無しさん :2022/11/11(金) 01:02:30.49 ID:NMTpQElqM.net
>>72
その探し方は、普通の関数のオーバーロード解決とは異なっていますね。
しかも、あなたの言っているほど単純じゃない。
実際は、優先順位があり、先に優先順位の低いものが見つかって、後から
優先順位が高いものが見つかっても、後の方が優先される。

あなたが馬鹿なのは、単純に考えすぎていることだ。

74 :デフォルトの名無しさん :2022/11/11(金) 01:03:31.20 ID:J8vKnsQy0.net
>>71
なんで答えが書かれた文書が誰でも読めるように公開されてるのに、わざわざ自分より劣った人間に答えを求めるの?
お前天才なんだろ?ここの誰よりも賢いんだろ?
消えな

75 :デフォルトの名無しさん :2022/11/11(金) 01:04:06.86 ID:hvQf6BDd0.net
>>74
すまんがお前が消えてほしい
相手するからつけあがる

76 :デフォルトの名無しさん :2022/11/11(金) 01:05:05.21 ID:NMTpQElqM.net
>>73
[補足]
なお、関数のオーバーロード解決でも、「変換できるかどうか」とかそんな単純な
ものじゃないです。
例えば、T a{x} のように{}が書いてあれば、中味が1個しか書いてなくても、
initializer_list が優先される、などと決まってます。

77 :デフォルトの名無しさん :2022/11/11(金) 01:05:24.11 ID:J8vKnsQy0.net
>>73
だから正確なのが知りたいなら規格読めやボケカス
お前のゴミ虫みたいな脳みそに合わせてわざわざ単純化してやったのに何だその物言いは無礼者の恥知らずが

78 :デフォルトの名無しさん :2022/11/11(金) 01:06:38.58 ID:NMTpQElqM.net
>>74
俺よりC++を知っている人だってこの世にいるから質問してる。
それでは質問サイトの意味がない。
調べればわかることでも知ってる人に聞いたほうが早い。

79 :デフォルトの名無しさん :2022/11/11(金) 01:07:31.06 ID:J8vKnsQy0.net
>>76
T a{x}ってそれ関数じゃなくて変数定義ですよ
そんな区別もつかないレベルじゃ規格書なんて早かったかなごめんね
でもそれも規格書に書いてあるから読んで勉強しろ

80 :デフォルトの名無しさん :2022/11/11(金) 01:07:50.72 ID:NMTpQElqM.net
>>77
あなたみたいなのが日本を衰退させている。
自分が頭がいいと思い込んでいるがかなり間違ってるし、レベルが低い。
そして、あなたの周りにはレベルの低い人しか回りに居ないから勘違いが
直らない。

81 :デフォルトの名無しさん :2022/11/11(金) 01:08:28.22 ID:NMTpQElqM.net
>>79
アホですか。
コンストラクタを探す話をしている。

82 :デフォルトの名無しさん :2022/11/11(金) 01:09:07.49 ID:J8vKnsQy0.net
>>78
ここで俺や他の人が説明してあげてる内容すら理解できないなら、規格書を泣きながら読むか死んだほうが早いと思うよ

83 :デフォルトの名無しさん :2022/11/11(金) 01:10:04.92 ID:NMTpQElqM.net
日本は分断化が激しい社会だ。
カシコが一部に集まり、アホがあほ同士集まっている。
だから自覚できない。
そういう社会にしてしまっていることが問題。

84 :デフォルトの名無しさん :2022/11/11(金) 01:10:52.44 ID:J8vKnsQy0.net
>>81
1行目のせいで関数のオーバーロード解決の話をしてるもんだと思ったよ
どうやらC++以前に日本語すら不自由なようだね

85 :デフォルトの名無しさん :2022/11/11(金) 01:11:25.32 ID:NMTpQElqM.net
>>82
お前は理解できてないのに質問に答えようとしている。
いつもは質問のレベルが低いから答えられているんだろうが、今回は
お前の能力を超えている。
そしていつもの調子で質問者をレベルが低いと思い込んでいるから
馬鹿にした態度をとる。

86 :デフォルトの名無しさん :2022/11/11(金) 01:11:57.99 ID:NMTpQElqM.net
>>84
お前に言われたくない。

87 :デフォルトの名無しさん :2022/11/11(金) 01:14:33.80 ID:NMTpQElqM.net
>>82
「してあげている」
って、おまえの思ってる直感的理解と、俺の求めている理解とは次元が違う。
お前は、いっぱんぴーぽーとしてC++を使えてもそれ以上はできないだろう。

88 :デフォルトの名無しさん :2022/11/11(金) 01:16:18.16 ID:J8vKnsQy0.net
もう終わりにするけど、俺の説明が間違ってるって言うならそれは規格と主要コンパイラの実装が間違ってるってことだから
ISOとベンダーに報告しときなよ

>>75
ごめんなさいみなさん久しぶりに面白いおもちゃだったのでつい

89 :デフォルトの名無しさん :2022/11/11(金) 02:19:52.16 ID:tp0srwYgd.net
キャラ剥がれてきてて草

90 :デフォルトの名無しさん :2022/11/11(金) 05:29:55.03 ID:wl59B58M0.net
std::array<T, N>って「N個の値xで埋める」コンストラクタありませんよね?
後でstd::fillするのが普通のやり方かもしれませんが、実際はstd::arrayのインスタンスができた時点でN個の何らかの初期値が入るんですよね?
この仕様に困ってます。
例えば、boost::multi_arrayは構築時にメモリの並び方 (Cライク or fortranライク) が決まって、後で変更する方法は提供されてないんですが、 std::array<boost::multiarray, N> を作ってしまうとメモリの並び方が勝手に決まってしまいます。
std::array の各要素のコンストラクタをこちらで呼ぶ方法があったら教えてください。
初期化リストで構築するやり方はNが大きいときは現実的でないので考えておりません。

91 :デフォルトの名無しさん :2022/11/11(金) 07:32:36.01 ID:fbtAWiSRH.net
>>54
逆はないと思いますよ

92 :デフォルトの名無しさん :2022/11/11(金) 07:44:40.78 ID:J8vKnsQy0.net
>>90
残念ながらarrayで初期化時にやるのは無理
arrayは組み込み配列と同じ初期化方法(集成体初期化)しか出来ないように意図的に設計されてて特別なコンストラクタを持たない
だからarray::fill()が用意されてるので普通はそれを使う
どうしてもその場で要素のコンストラクタを直接呼びたいなら一回構築してから要素ごとにデストラクタ→placement newを呼ぶしかない
最初のデフォルト構築も許せないならarray(と組み込み配列)を使うのは諦めよう

93 :デフォルトの名無しさん :2022/11/11(金) 15:28:43.83 ID:x9X8FiGQM.net
>>91
いくらアインシュタインが相対性理論を説明しても、一般人には理解できない。
どんなに天才でも、説明できない事柄がある。

94 :デフォルトの名無しさん :2022/11/11(金) 19:19:22.94 ID:+I+8FBiLd.net
天才ほど説明が下手だね
天賦の才に頼らず這い上がった苦労人タイプの
説明のほうが一般人には分かりやすい

95 :デフォルトの名無しさん :2022/11/11(金) 20:11:09.74 ID:MfyOP1HR0.net
わかった気になるだけってやつね
完全に理解する必要のない一般人ならそれもあり

96 :デフォルトの名無しさん :2022/11/11(金) 20:47:56.26 ID:76yLxZ0B0.net
誰かを見下していなきゃ自分を保てない小さいやつ

97 :デフォルトの名無しさん :2022/11/11(金) 23:42:57.00 ID:jawQM+EmM.net
確かに右辺値参照あたりの仕組みはコピー減らそうという意図が感じられる割に徹底しようとするとstd::arrayとかのctorで足元すくわれがち

98 :デフォルトの名無しさん (ワッチョイ 7501-WFXv):2022/11/12(土) 01:01:47.32 ID:0JLM8m+J0.net
ワッチョイつけると炎上しなくて良いね

99 :デフォルトの名無しさん :2022/11/12(土) 07:48:03.70 ID:GOjTxZ8j0.net
arrayは組み込み配列の糞さ緩和が目的なので糞が多少まろび出るのは仕方ないんよね

100 :デフォルトの名無しさん :2022/11/12(土) 09:59:28.06 ID:D5o/xiXJ0.net
>>92
collectionで初期化も無理なんだ?
せめてvectorで初期化できるなら良かったのにね

101 :デフォルトの名無しさん :2022/11/12(土) 11:30:02.52 ID:GOjTxZ8j0.net
1つでもコンストラクタを独自定義したら集成体になれないので仕方ない

102 :はちみつ餃子 :2022/11/12(土) 14:25:39.92 ID:5guAadWy0.net
>>90
要素のデフォルトコンストラクタは呼ばれるので要素のほうに適当なラッパーを被せるという方法はとれなくはない。
こういうラッパーならスタンダードレイアウトの要件は満たすのでバイト列レベルでも互換性は維持されるはず。

#include <array>
#include <iostream>

struct foo {
// このコンストラクタを呼んで欲しい
foo(int x){
std::cout << x << std::endl;
}
};

template <class T, auto N>
struct initializing_wrapper : public T {
initializing_wrapper(void) : T(N) {}
};

int main() {
std::array<initializing_wrapper<foo, 1> , 3> foo;
}

103 :デフォルトの名無しさん :2022/11/12(土) 23:48:04.66 ID:2iksiTkL0.net
vscodeでeigen使ったコード書いてるんだけど、デバッグ時にeigenの変数見る方法ある?
visualstudioならあるっぽいんだけど、vscode上でしょりしたいんだよね

104 :デフォルトの名無しさん :2022/11/13(日) 00:14:31.39 ID:5VmZbZRR0.net
普通に変数ウォッチで見えんの?

105 :デフォルトの名無しさん :2022/11/13(日) 04:06:31.61 ID:L3LR+iGt0.net
ちょ、何これ? 聞いてないんだけど。。。

C:/msys64/mingw64/include/c++/12.2.0/bits/stl_pair.h:326:13: note: declared here
326 | pair& operator=(const pair&) = delete;

C:/msys64/mingw64/include/c++/12.2.0/bits/stl_pair.h:715:5: note: declared here
715 | swap(pair<_T1, _T2>&, pair<_T1, _T2>&) = delete;

106 :デフォルトの名無しさん :2022/11/13(日) 07:39:53.36 ID:alAGhxI40.net
>>103
eigen一回も使ったことないしググってもないけど、行列の先頭要素のメモリにアクセスする方法が提供されてないわけないので、それを使う
普通はdata()とかget()なるメンバ関数がある

107 :デフォルトの名無しさん :2022/11/13(日) 11:52:46.36 ID:7rETCoZw0.net
>>105
-std= で規格を指定するとか?

108 :デフォルトの名無しさん :2022/11/13(日) 12:42:20.71 ID:JmrIg+tw0.net
-std=c++20にしてる

109 :はちみつ餃子 :2022/11/13(日) 14:31:41.33 ID:sejtbDAm0.net
>>105
本来使われるはずの定義はこっち。
https://github.com/gcc-mirror/gcc/blob/e24b430f1ea60205162fd9b327ac6a4dfc57f37c/libstdc%2B%2B-v3/include/bits/stl_pair.h#L371-L379

必要な性質 (要素の型が copy_assignable) が満たされていないときに最も優先度が低いやつが選択された上でそれが delete されているということになるんだと思う。
https://github.com/gcc-mirror/gcc/blob/e24b430f1ea60205162fd9b327ac6a4dfc57f37c/libstdc%2B%2B-v3/include/bits/stl_pair.h#L368

110 :デフォルトの名無しさん :2022/11/13(日) 16:56:29.94 ID:L3LR+iGt0.net
壮大なSFINAEってわけか・・・
元コードは晒せないんであとは自分で探すしかないな

ヒントありがと、餃子さん

111 :はちみつ餃子 :2022/11/13(日) 18:18:04.90 ID:sejtbDAm0.net
どうせ使えないなら使おうとしたときに static_assert で問題点を出すようにしたらいいのにと思ったがよく考えるとそれは駄目なんだな。
適用できるものがないということを SFINAE のトリックに使うことがあるかもしれない。
(static_assert が展開されると他の候補があっても問答無用で終わりになってしまう。)

112 :デフォルトの名無しさん :2022/11/13(日) 18:23:28.51 ID:BN7kyEsvM.net
いつもサナエさんにはお世話になってる

113 :デフォルトの名無しさん (アウアウウー Saa9-FFna):2022/11/14(月) 12:10:20.06 ID:EWF0SvAna.net
>>94-95
天才とパンピーで理解レベルのバックグラウンド知識に差があるからだろ
その差を埋める説明を一瞬で出来る人はそれなりの才能があるとは思うが
天才同士ならそんな説明いちいちしなくても判り合えるんだ

114 :デフォルトの名無しさん (スップ Sd03-3Wva):2022/11/14(月) 19:05:49.95 ID:KWfGC8qSd.net
天才はそもそも他人の説明なんかいらんからな

115 :デフォルトの名無しさん :2022/11/14(月) 22:27:38.95 ID:sRgsAS70H.net
自分が天才だ!とわざわざ自称しなくても、天才らしい雰囲気をかもし出せるレスはないものでしょうかね…
自称天才はもういいし

116 :デフォルトの名無しさん :2022/11/14(月) 22:42:37.02 ID:rM2EwItV0.net
ギフテッドって凄すぎて訳わからんからな

117 :デフォルトの名無しさん :2022/11/15(火) 12:36:06.45 ID:+zOZoQ9YM.net
プログラミング言語 C++ [第四版], 日本語訳 の p.689 に、
template<typename T>
class Xref {
 ・・・
};
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a)
{
 return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
auto p1 = make_unique<Xref<String>>(7,"Here");
「ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
が呼び出される。」
とありますが、実引数の文字列リテラル "Here" が、make_unique()の
仮引数 A&& に渡そうとしたら、A = string と「演繹」されているようですが、
const char* 型が string に至るまでの仕組みか分かりません。
どなたが分かる人居ませんか?

実際の STL の sting は basic_string<U> テンプレートの U=charの
場合だと思われますが、意味を概念的に言えば、
class string {
public
// 変換コンストラクタ :
string(const char *) {・・・}
};
という「変換コンストラクタ」があるでしょうから、それが使われている
ことは推定は出来ます。
しかし、上記のテンプレートで T を演繹する際に、このような変換コンストラクタ
が呼び出されるメカニズムが分かりません(仕様書のどこに書いてあるのかが
分からない。)。

118 :デフォルトの名無しさん :2022/11/15(火) 12:51:05.19 ID:+zOZoQ9YM.net
>>117
もっと詳しく書くと、直前から次のように書かれています:
# Xref<String>はXref<string>の写し間違いでした。
string x {"There and back again"};
template <typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept;
template <typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
ここで望まれるのは、不純なコピーを一切作ることなく、
make_unique<T>(arg)がargからTを構築することである。
その実現には左辺値と右辺値の区別を管理することが重要だ。
次の例を考えてみよう:
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a) // make_sharedのちょっとした変種
{
 return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
auto p1 = make_unique<Xref<string>>(7,"Here");
ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
が呼び出される。
そして、"Here"を格納しているstringのムーブを行なうために、
Xref(int,string&&)が呼び出されることになる。
# 個人の感想: これは、A=stringと考えられます。
もっと興味深い(しかも分かりにくい)のが、次のものだ:
auto p2 = make_unique<Xref<string>>(9,x);
ここで、xが左辺値なので、左辺値を引数にforward(string&)が呼び出される。
forward()のTは、string& と導出される。そのため、返却値は string & &&となる。
もちろんそれは string & を意味する(§7.7.3)。その結果、左辺のxに対して、
Xref(int,string&)が呼び出されて、xがコピーされる。
# 個人の感想: これは、A=string&と考えられます。

119 :デフォルトの名無しさん :2022/11/15(火) 12:53:27.82 ID:+zOZoQ9YM.net
>>118
[参考]
p.724,
「文字列リテラルは、テンプレート引数には『渡せない』」
ただし、これがどう関係しているのかは不明です。
A&& a の部分に文字列リテラル"Here"を渡してはいますが。

120 :デフォルトの名無しさん :2022/11/15(火) 12:56:01.43 ID:f326q+3ca.net
ある型が来たらそれに応じた変換をするのが、何か問題なんでしょうか

121 :デフォルトの名無しさん :2022/11/15(火) 12:57:17.27 ID:slZuGS0Ed.net
make_uniqueの実体化の所でTT=Xref<String>、T=Stringって明示的に指定してるじゃん
「演繹」なんかするまでもないから規格に書いてるはずもない
天才のくせにそんな事も分からないの?

122 :デフォルトの名無しさん :2022/11/15(火) 13:00:23.02 ID:+zOZoQ9YM.net
>>119
[ヒント]
前頁p.688の下段:
「左辺値と右辺値は、テンプレート引数の導出では区別される。
X型の左辺値はX&として導出されて、右辺値はXとして導出される。
これは、非テンプレート引数の右辺値参照への値のバインド
(§12.2.1)とは異なる。
しかし、引数転送(§35.5.1)においては、極めて有用だ。
Xrefを空き領域上に置いて、そのポインタをunique_ptrとして
返すファクトリ関数を記述する場合を考えてみよう:

の直後、ページが変わってページの最初に>>118の std::forward テンプレート
の定義が書いて有ります。

123 :デフォルトの名無しさん :2022/11/15(火) 13:02:34.01 ID:slZuGS0Ed.net
引用の範囲超えてるんで著作権侵害の疑いで削除依頼出しますね

124 :デフォルトの名無しさん :2022/11/15(火) 13:03:00.86 ID:+zOZoQ9YM.net
>>121
TTは、Xref<string>と明示的に指定されてますが、AはTTとの関係は
書いて無いはずです。
なので、それだけでは、A=stringとは分からないはずでは。

125 :デフォルトの名無しさん :2022/11/15(火) 14:16:43.16 ID:D78/LkiC0.net
new TT{i, forward<A>(a)}
既出だが、こう書いてあってもXrefのメンバの型がどうなるか分からんわけでしょ

先日の質問と合わせて、型パズルをスラスラ解けるような資質がない
資質がないんでXrefの『関係ない』としたところを「・・・」で埋めてる

126 :はちみつ餃子 :2022/11/15(火) 15:01:57.79 ID:5Bng48RE0.net
>>117
どういう文脈で説明されてるのかよくわからんが
引数が文字列リテラルの "Here" なら A は const char (&)[5] に推論されるよ。

127 :デフォルトの名無しさん :2022/11/15(火) 16:18:06.60 ID:Q+AZCxhHM.net
>>126
命題『A が const char (&)[5] に推論される』・・・☆
とし、背理法で考えます。
☆が正しいと仮定すると、
forward<A>(a)は、forward<const char (&)[5]>(a)となりますが、すると、
template <typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept;
template <typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
に対して、forward<const char (&)[5]>(a)
が呼び出されることになります。
しかし、
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
とBJ stroustrup氏が書いています。
ならば、T=const char (&)[5]の時に、
typename remove_reference<T>::type
がstringにならなければなりません。つまり、
typename remove_reference<const char (&)[5]>::type
がstringになってないと矛盾する事になります。
もし、矛盾するならば、背理法により、☆は否定されることになります。
(矛盾しそうです。)

128 :デフォルトの名無しさん :2022/11/15(火) 16:42:50.09 ID:Q+AZCxhHM.net
>>127
これは背理法とは言わなかったわ。
スマソ

129 :デフォルトの名無しさん :2022/11/15(火) 16:49:22.19 ID:f326q+3ca.net
メロスはポリモーフィズムがわからない

130 :デフォルトの名無しさん :2022/11/15(火) 17:18:50.72 ID:eijjsxUX0.net
Perfumeの楽曲だろ?

131 :はちみつ餃子 :2022/11/15(火) 18:04:53.44 ID:5Bng48RE0.net
>>127
> ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
> が呼び出される。

文字列リテラルは左辺値。 右辺値だと書いてあるのならそれが間違っている。
配列がポインタに (暗黙的でも明示的でも) キャストされる文脈では
そのポインタは xvalue (おおよそ右辺値のような扱いになる分類) になるが、
今回は変換が入らずに参照で受けているのでそうはならない。

/// この場合は rvalue 扱い
#include <cstdio>
void foo(const char *&x) { std::printf("lvalue"); }
void foo(const char *&&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }

/// この場合は lvalue 扱い
#include <cstdio>
template <class T> void foo(const T &x) { std::printf("lvalue"); }
template <class T> void foo(const T &&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }

132 :デフォルトの名無しさん :2022/11/15(火) 18:53:35.18 ID:mUSyU2rD0.net
文字列リテラルが左辺値ってなんで?

133 :デフォルトの名無しさん :2022/11/15(火) 20:56:02.85 ID:aOXxipO5M.net
文字列リテラルは実際は配列
⇒アドレスで区別できるメモリ上のオブジェクト
⇒つまりlvalue

134 :デフォルトの名無しさん :2022/11/15(火) 20:56:58.78 ID:kbPjYi7D0.net
文字列リテラルはメモリ上に永続的に保持されるんだから勝手に持ってっちゃダメでしょ

135 :デフォルトの名無しさん :2022/11/15(火) 21:11:40.64 ID:DJ4SZBHq0.net
文字列リテラルは配列型のlvalue
文字列リテラルが左辺値変形されて生じたポインタはrvalue

136 :はちみつ餃子 :2022/11/15(火) 23:54:26.84 ID:5Bng48RE0.net
配列 (文字列を含む) と関数は値として扱えない、勝手にポインタに型変換するという
C から引き継いだ変則的なルールに辻褄を合わせているので全体的に変則的で
分かりにくいんだよ……。

137 :デフォルトの名無しさん :2022/11/16(水) 00:19:44.88 ID:g3O9ReAZM.net
>>131
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
と書かれています。
なので、"Here"がなんらかのメカニズムでstd::stringに変換されていると
解釈しました。
実験すれば白黒はっきりさせることが出来るかも知れません。

138 :デフォルトの名無しさん :2022/11/16(水) 00:20:20.66 ID:DtzZSdSg0.net
マジで間違った方向に引きずり回してんのか
やっぱりすげーな
こいつは上級者だ

139 :デフォルトの名無しさん :2022/11/16(水) 00:29:08.01 ID:g3O9ReAZM.net
>>138
C++の父であるところのBJ Stroustrup氏が直々に書いていることなのですが。

140 :デフォルトの名無しさん :2022/11/16(水) 00:32:07.57 ID:Nbbm6FAB0.net
禿本手元にないから確認はできないけど、「"Here"が右辺値」なんて基本的な間違い書くとは思えないんだけど
侵害くんの読み間違いか書き間違いか、本当に書いてあるなら翻訳ミスじゃないの

141 :デフォルトの名無しさん :2022/11/16(水) 00:32:57.76 ID:Nbbm6FAB0.net
>>139
"Here"の配列→(配列とポインタの糞ルール)→const char*→(stringの変換コンストラクタ)→string
と変換された結果のstring一時オブジェクトが右辺値だってクドクド書いてない?ちゃんと読んだ?

142 :デフォルトの名無しさん :2022/11/16(水) 00:38:01.28 ID:g3O9ReAZM.net
原書(英語版)はこうなってます:
23.5.2.1. Reference Deduction
...

template<typename T>
class Xref {
public:
   Xref(int i, T* p)    // store a pointer: Xref is the owner
      :index{i}, elem{p}, owner{true}
   {}
Xref(int i, T& r)    // store a pointer to r, owned by someone else
      :index{i}, elem{&r}, owner{false}
   {}
Xref(int i, T&& r)   // move r into Xref, Xref is the owner
      :index{i}, elem{new T{move(r)}}, owner{true}
   {}
~Xref()
   {
      if(owned) delete elem;
   }
   //...
private:
   int index;
   T* elem;
   bool owned;
};
...

143 :デフォルトの名無しさん :2022/11/16(水) 00:38:41.12 ID:g3O9ReAZM.net
>>142
template<typename T>
  T&& std::forward(typename remove_reference<T>::type& t) noexcept; //§35.5.1
template<typename T>
  T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a)   // simple variant of make_shared (§34.3.2)
{
  return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}

We want make_unique<T>(arg) to construct a T from an arg without making any spurious copies. To do that, it is essential that the lvalue/rvalue distinction is maintained. Consider: auto p1 = make_unique<Xref<string>>(7,"Here");

"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here". The more interesting (subtle) case is: auto p2 = make_unique<Xref<string>>(9,x); Here, x is an lvalue, so forward(string&) is called, passing along an lvalue: forward()’s T is deduced to string& so that the return value becomes string& &&, which means string& (§7.7.3). Thus, Xref(int,string&) is called for the lvalue x, so that x is copied.

Stroustrup, Bjarne. The C++ Programming Language (p.689). Pearson Education. Kindle 版.

144 :デフォルトの名無しさん :2022/11/16(水) 00:40:39.32 ID:85X5ndMu0.net
C++ど素人なんですが、この画像のようなファイル群がある時に、Visual Studioでexe化するにはどうしたら良いですか?

まず、ファイルはsln形式などになってないですが、そういったものはつくる必要はなく、ExpressionApp.cppだけ開いてビルドボタンを押したりすれば良い感じなのでしょうか?

145 :デフォルトの名無しさん :2022/11/16(水) 00:41:05.14 ID:85X5ndMu0.net
>>144
すみません、画像を貼り忘れました
https://i.imgur.com/zn41rYL.png

146 :デフォルトの名無しさん :2022/11/16(水) 00:41:14.43 ID:Nbbm6FAB0.net
えぇ…禿さん耄碌してんなあ

147 :デフォルトの名無しさん :2022/11/16(水) 00:41:57.33 ID:Nbbm6FAB0.net
>>145
cmake使え

148 :デフォルトの名無しさん :2022/11/16(水) 00:42:22.40 ID:g3O9ReAZM.net
>>140
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here".

>>141
テンプレート関数なので、Aという方引数が決定されるメカニズムが重要となります。
Aがstringに決定されたならば、文字列リテラルからstringへの変換法則はおなじみの
ものとなります。
それよりも、まず、どうしてAがstringに決定されたのかの「仕組み」が分かりません。

149 :デフォルトの名無しさん :2022/11/16(水) 00:44:42.87 ID:P8Ivr6rPa.net
>>144
プロジェクト作ればいいよ

150 :デフォルトの名無しさん :2022/11/16(水) 00:50:02.83 ID:g3O9ReAZM.net
>>143
142と143の間に、次の記述が挟まっています。
So:
string x {"There and back again"};
Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
Xref<string> r2 {9,x}; // r2 just refers to x
Xref<string> r3 {3,new string{"There"}}; // r3 owns the string{"There"}

Here, r1 picks Xref(int,string&&) because x is an rvalue.
Similarly, r2 picks Xref(int,string&) because x is an lvalue.
Lvalues and rvalues are distinguished by template argument deduction:
an lvalue of type X is deduced as an X& and an rvalue as X.
This differs from the binding of values to non-template argument rvalue references (§12.2.1)
but is especially useful for argument forwarding (§35.5.1).
Consider writing a factory function that make Xrefs on the free store and returns
unique_ptrs to them:

151 :デフォルトの名無しさん :2022/11/16(水) 00:50:03.82 ID:85X5ndMu0.net
>>147
ありがとうございます
やってみます

152 :はちみつ餃子 :2022/11/16(水) 00:51:20.49 ID:eOApcCVI0.net
>>137
文字列リテラルが lvalue なのはややこしい解釈の余地はなく直接的に明記されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.prim.general#1

少なくとも

> "Here"は右辺値なので

というのは確実に誤った記述だよ。
最初の段階で誤っているのだからそこから後の理屈の立て方に筋が通るはずがない。

>>148

A は string に決定されない。
そういう仕組みは無いのでそれを前提として考えるな。

153 :デフォルトの名無しさん :2022/11/16(水) 01:10:00.99 ID:g3O9ReAZM.net
>>152
>A は string に決定されない。
>そういう仕組みは無いのでそれを前提として考えるな。
なるほど。しかし、だとすれば、
「Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
 "Here" is an rvalue, so forward(string&&) is called, passing along an rvalue,
 so that Xref(int,string&&) is called to move from the string holding "Here".」
の部分はどう説明できますか?

154 :デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ):2022/11/16(水) 01:14:18.30 ID:g3O9ReAZM.net
>>153
今思ったんですが、もしかしたら、
>Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
の部分が、
Consider: auto p1 = make_unique<Xref<string>>(7,string{"Here"});
の書き間違いだったのかもしれませんね。

なお、直接関係有りませんが、>>150
>Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
>Here, r1 picks Xref(int,string&&) because x is an rvalue.
は、確認しましたが、kindle版は確かに正確にこう書かれていますが、
このr1の定義部分に「x」は存在しておらず、代わりに"Here"が存在していますので
そこも書き間違いかも知れません。

155 :デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ):2022/11/16(水) 01:26:05.39 ID:g3O9ReAZM.net
もしくわ、
>auto p1 = make_unique<Xref<string>>(7,"Here");
は、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書きたかったのでしょうか。つまり、もし、
auto p1 = make_unique<Xref<string>>(7,string{"Here"});
または、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書いてあったならば、辻褄が合いそうです。

156 :デフォルトの名無しさん :2022/11/16(水) 05:12:39.73 ID:c3tWnPnh0.net
文字を反転させる関数を作っているのですがうまく行きません
voidの部分がおかしいと思うんですが正直手詰まりです
誰か解決策はありますでしょうか
実行するとrevarce関数が飛ばされて終了してしまいます

void revarse(char* p, char* r);
int main(void)
{
char str1[64];
char str2[64] = {};

printf("文字列を入力\n>>");
scanf("%s", str1);

revarse(str1, str2);

printf("%s", str2);

rewind(stdin);
getchar();
return 0;
}
//反転させる関数
void revarse(char* p, char* r)
{
int len = strlen(p);

for (int i = 0; i <= len / 2; i++)
{
*(r + i) = *(p + (len - i));
}
}

157 :デフォルトの名無しさん :2022/11/16(水) 05:28:39.68 ID:PEnRRRQh0.net
おい、もうテメーの日記帳に書いとけや

158 :デフォルトの名無しさん :2022/11/16(水) 05:33:02.42 ID:5+x4ry0S0.net
>>156
文字列pが "12345" だとして考えてみ?
len=5 だろ?

*(p + (len - i));

これって i=0 の時 *(p + (5 - 0)) => *(p + 5) ってことになる

ゼロベースだからインデックス5にはNULL文字'\0'が入っている
それを*r にコピーしている
つまりコピーされるのは常に長さ0の文字列
そりゃ出力したってなにも表示されないさ

あとlen / 2はおかしいだろ
練習するならマルチバイトはまず置いておいてシングルバイト文字のみ扱え

159 :デフォルトの名無しさん :2022/11/16(水) 05:50:25.16 ID:c3tWnPnh0.net
>>158
ありがとうございます!
助言道理に直したら無事に反転させることができました!
本当にありがとうございます!
精進します!

160 :デフォルトの名無しさん :2022/11/16(水) 06:49:36.90 ID:f7msq55Zd.net
実習問題臭いのが気になる

161 :デフォルトの名無しさん :2022/11/16(水) 08:13:10.02 ID:6xMrEJ8a0.net
int と N 要素の vector<double> から N+1 要素の tuple<int, double, double,...> を作る方法ってありますか

162 :デフォルトの名無しさん :2022/11/16(水) 08:25:10.43 ID:Nbbm6FAB0.net
Nがコンパイル時に決まってないと無理

163 :デフォルトの名無しさん :2022/11/16(水) 13:34:55.97 ID:DtzZSdSg0.net
>>152
証拠の壁画が出てきた
https://i.imgur.com/9aiVMvr.png

164 :はちみつ餃子 :2022/11/16(水) 13:42:47.25 ID:eOApcCVI0.net
>>163
何の証拠?

165 :デフォルトの名無しさん :2022/11/16(水) 13:43:50.52 ID:DtzZSdSg0.net
わからん

166 :はちみつ餃子 :2022/11/16(水) 14:24:03.96 ID:eOApcCVI0.net
>>142
よく見るとデータメンバの名前が owned なのに初期化のほうでは owner になってるな。
実際にコンパイルしてみようとして気づいたわ。

167 :デフォルトの名無しさん :2022/11/16(水) 17:43:24.39 ID:z+sJwdsYa.net
>>144
>>147 が正解だが
Readme.txt も読んだか?

168 :はちみつ餃子 :2022/11/16(水) 17:43:42.62 ID:eOApcCVI0.net
>>148
clang に抽象構文木を見る機能があるのを思い出した。
それを通したらこんな感じ。
https://wandbox.org/permlink/NNaci7k0QcpFXc9G

表示の正確な読み取り方はワイも知らんのやが lvalue "Here" と出てるのはわかるし、
関数に渡したときに const char (&)[5] として受け取られているのはわかるやろ。

169 :デフォルトの名無しさん :2022/11/16(水) 17:47:22.63 ID:z+sJwdsYa.net
>>161-162
Nim

170 :デフォルトの名無しさん :2022/11/19(土) 11:03:08.07 ID:GrOHAxDN0.net
>>161
vectorの取りうるサイズがある程度決まってるのなら
予めdoubleの数が異なるtupleを用意しておくという手はある

#include <iostream>
#include <any>
#include <vector>
#include <tuple>
using namespace std;
using Vector = vector <double>;
using Int_Double_1 = tuple <int, double>;
using Int_Double_2 = tuple <int, double, double>;

any make_tuple_from_int_vector (int p0, const Vector &p1)
{
if (p1.size () == 1)
return make_tuple (p0, p1 [0]);
else if (p1.size () == 2)
return make_tuple (p0, p1 [0], p1 [1]);
else
return any ();
}

int main ()
{
Vector v1 (1, 10);
Vector v2 (2, 100);
auto v3 (any_cast <Int_Double_1> (make_tuple_from_int_vector (1000, v1)));
auto v4 (any_cast <Int_Double_2> (make_tuple_from_int_vector (10000, v2)));
return 0;
}

171 :デフォルトの名無しさん :2022/11/19(土) 16:17:21.48 ID:F8GIHVyHa.net
本当の目的を聴きたい

172 :デフォルトの名無しさん :2022/11/19(土) 19:46:58.80 ID:IQ1PkgMa0.net
true &&false計算するのと1&&0計算するのはどっちが早いとかある?

173 :デフォルトの名無しさん :2022/11/19(土) 19:50:29.13 ID:o7Lf802R0.net
はちみつもたまには役に立つな。
褒めてつかわす。
下がって良いぞ。

174 :デフォルトの名無しさん :2022/11/19(土) 23:24:23.61 ID:G53M1f4ia.net
>>172
trueは1なので同じです

175 :はちみつ餃子 :2022/11/20(日) 00:27:52.78 ID:RgPem6BD0.net
>>172
オペランドがリテラルならコンパイル時に畳み込まれるので同じ。
そうではなく型による差について問うているのなら
少なくとも現代的な処理系・実行環境だとまず差は出ないよ。
うまいこと最適化されてそんな差はどうでもよくなる。

言語仕様通りの素朴な解釈だと両オペランドを bool に型変換するという工程が入るので
int の && のほうが余計に処理をすることにはなるが……。

ちなみに C と C++ では規則が違うので詳細を調べるなら混同しないように注意。
(文言は違うけど結果的な挙動はほぼ差はないんだけど。)

176 :デフォルトの名無しさん :2022/11/20(日) 13:22:48.35 ID:9/YCbfcZM.net
>>172
どちらも、最適化されれば false(偽) になって同じコードになる。

177 :デフォルトの名無しさん :2022/11/20(日) 13:29:22.75 ID:9/YCbfcZM.net
>>176
[補足]
最適化には高レベルから低レベルまでさまざまな層で行なわれる。
高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
コードになる。
&& や || は、シーケンスポイントがあり A && B は A が偽ならば B を評価しないし、
A || B は、A が真なら B を評価しないので、マシン語レベルで条件 jump 命令が
生成されることが有るが、&& や || は、「高レベル」でも最適化する方法が
知られているので、このような場合、条件 jump 命令が生成されない。
また、仮に高レベルでは条件 jump 命令が生成されてしまった場合でも、
低レベルで最適化する際に、必ず真になったり必ず偽になるような条件 jump は、
無条件jumpになったり、削除されたりする。
そして、直後の命令への無条件 jump は、削除される。
二段階の無条件 jump は一段階の jump に修正される。
このような最適化を何度も何度も繰り返すので、結果的に同じことをするコードは、
同じコードになることが多い。

178 :デフォルトの名無しさん :2022/11/20(日) 13:42:45.47 ID:9/YCbfcZM.net
>>177
誤:最適化には高レベルから低レベルまでさまざまな層で行なわれる。
正:最適化は高レベルから低レベルまでさまざまな層で行なわれる。

誤:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
正:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで修正されて短い

179 :デフォルトの名無しさん :2022/11/22(火) 08:37:00.41 ID:JLBL5Nrvd.net
windowsでstd::create_symlinkを使おうとすると
特権がいるって言われるけど、何でそんな決まりになってんの?
mklinkコマンドも特権モードじゃないとシンボリックリンク作れないし
それのどこがそんなに危険な操作なのか理解に苦しむ

180 :デフォルトの名無しさん :2022/11/22(火) 09:20:47.14 ID:+RKYLIKe0.net
権限のないディレクトリにシンボリックリンクを作ろうとしてるのでは?

181 :デフォルトの名無しさん :2022/11/22(火) 09:57:07.23 ID:ROGUGHEjd.net
C:じゃないHDDだし俺専用PCだし
所有権でややこしいことにはなりっこない

182 :デフォルトの名無しさん :2022/11/22(火) 10:05:16.45 ID:emKQg5jla.net
特権の問題じゃなくて変なもん作ろうとしとる

183 :デフォルトの名無しさん :2022/11/22(火) 10:21:25.02 ID:5norvibI0.net
ディレクトリの権限関係なくWindows のシンボリックリンクの作成自体に管理者権限が必要、理由は知らん
ディレクトリにリンク張るならジャンクション(こっちは管理者権限不要)使えってことかも
ジャンクションの作成はコマンドからならmklink /jで行けるけどコードからやるのはちょっと面倒みたい
https://stackoverflow.com/questions/29291059/issue-creating-windows-ntfs-directory-junction-in-c-c

184 :デフォルトの名無しさん :2022/11/22(火) 16:05:23.29 ID:glPNIX2fd.net
一般人に使わせるとショートカットと混同して危険だからそうしてるってどっかで見た
何が危険なのかは分からなかった

185 :デフォルトの名無しさん :2022/11/22(火) 16:27:39.36 ID:tXIkHCtk0.net
>ユーザー権利を持つユーザーは、誤って、または悪意を持ってシステムをシンボリック リンク攻撃に公開する可能性があります。
>シンボリック リンク攻撃は、ファイルのアクセス許可の変更、データの破損、データの破棄、または DoS 攻撃として使用できます。
というのが、Microsoft の公式見解

186 :デフォルトの名無しさん :2022/11/22(火) 16:40:48.52 ID:+RKYLIKe0.net
>>185
読んでもサッパリ分からん
なんすか? その「シンボリックリンク攻撃」って?
それUNIXでは生じないの?

187 :デフォルトの名無しさん :2022/11/22(火) 16:44:11.97 ID:5norvibI0.net
>>185
これソースある?
シンボリック経由でファイルやフォルダーの権限って変わるんだっけ?

188 :デフォルトの名無しさん :2022/11/22(火) 16:48:44.26 ID:tXIkHCtk0.net
シンボリック リンクの作成 (Windows 10) - Windows security | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/create-symbolic-links

189 :デフォルトの名無しさん :2022/11/22(火) 17:02:07.48 ID:5norvibI0.net
>>188
リンク先には攻撃方法は書いてないな

シンボリックリンク攻撃 でググるとこれが出てきた
特にWindows特有というわけじゃなさそう、て言うかWindowsは/tmpみたいな誰もが共通的に使うディレクトリはないからより攻撃は難しそうだが
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c802.html

190 :デフォルトの名無しさん :2022/11/22(火) 19:09:40.02 ID:zDRYE0v60.net
他の人の書いたコードを読み解いています。

下の例では、キーが押されたら何かを切り替えてるのはわかるのですが、ここで使われている
・0xFの意味
・(1 << 0)などの右シフト?
がどういう使われ方をしてるのかが分からないので知りたいです。

16進数で掛け算して値を使っているのでしょうか?
単純な1,2,3,4などの数値で切り替えていないのも意図がよく分からないのでずが深い意味はありそうでしょうか?

// VIEW_MESH | VIEW_IMAGE | VIEW_PLOT | VIEW_LM
int _viewMode = 0xF;

enum
{
VIEW_MESH = (1 << 0),
VIEW_IMAGE = (1 << 1),
VIEW_PLOT = (1 << 2),
VIEW_LM = (1 << 3)
};

switch (key)
{
case 'i': _viewMode ^= VIEW_IMAGE; break;
case 'l': _viewMode ^= VIEW_LM; break;
case 'm': _viewMode ^= VIEW_MESH; break;
}

191 :デフォルトの名無しさん :2022/11/22(火) 19:21:19.72 ID:3Sn7h5kH0.net
>>190
>・0xFの意味
16進数、10進数の15、2進数の1111

> ・(1 << 0)などの右シフト?
左シフト、1 << 0に関して言えば0ビットシフトなのでつまりシフトしない、二進数で0001、10進数で1
(1 << 1)は1ビット左にシフトなので二進数で0010、10進数で2
(1 << 2)は2ビット左にシフトなので二進数で0100、10進数で4
(1 << 3)は3ビット左にシフトなので二進数で1000、10進数で8

192 :デフォルトの名無しさん :2022/11/22(火) 19:40:28.84 ID:3Sn7h5kH0.net
>>190
^= は複合代入演算子

_viewMode ^= VIEW_IMAGE は _viewMode = _viewMode ^ VIEW_IMAGE と同じ

^ は排他的論理和(ビットXOR)、二進数で 1001 ^ 1100 は 0110 になる、要はビットが同じなら偽、異なっていれば真という演算

>case 'i': _viewMode ^= VIEW_IMAGE; break;
_viewModeには1111が代入されている、VIEW_IMAGEは0010
1111 ^ 0010 は 1101 になる
その演算結果1101を_viewModeに代入する

一連のコードはビットをフラグとして扱っていて、初期値として全フラグを立たせ、keyに対して特定のフラグをへし折っている

193 :デフォルトの名無しさん :2022/11/22(火) 20:24:07.39 ID:zDRYE0v60.net
>>191
>>192
ありがとうございます
なるほど!フラグをへし折っているのですね納得です

194 :デフォルトの名無しさん :2022/11/22(火) 22:10:58.50 ID:TSfOUCtJ0.net
論理演算とか知らない奴がプログラムやっているんだな・・・

195 :デフォルトの名無しさん :2022/11/22(火) 22:14:00.95 ID:+RKYLIKe0.net
始めたばっかりなんでしょ
ビットをフラグとして使うとか最初は面食らったな

196 :デフォルトの名無しさん :2022/11/22(火) 22:48:40.37 ID:s23xOfAqp.net
ファミコンでもあるまいし、いまどき1ビットに意味をもたせなんて、通信制御くらいしか思い付かないなぁ

197 :デフォルトの名無しさん :2022/11/22(火) 23:01:34.34 ID:tXIkHCtk0.net
マシン語のレベルで、演算結果を示す幾つかの1ビットデータがあって
それらにキャリーフラグ、ゼロフラグなどの名前が付いてたのが呼び方の元

198 :デフォルトの名無しさん :2022/11/22(火) 23:04:06.68 ID:s23xOfAqp.net
恋愛ゲームのフラグと同意語だよな

199 :デフォルトの名無しさん :2022/11/22(火) 23:10:53.75 ID:+RKYLIKe0.net
flagでしょ
大元は手旗信号

200 :デフォルトの名無しさん :2022/11/22(火) 23:22:36.31 ID:5norvibI0.net
>>196
経験値が低いだけだろ
APIとか使ってたら普通に使うわ

201 :デフォルトの名無しさん :2022/11/22(火) 23:49:48.37 ID:s23xOfAqp.net
>>200
そうか?普通#defineされてる名前を使うからあんま意識しないよ?

202 :デフォルトの名無しさん :2022/11/22(火) 23:59:07.88 ID:tXIkHCtk0.net
後方互換性や制御系の都合かもね

203 :デフォルトの名無しさん :2022/11/23(水) 00:01:47.87 ID:6zcmIvp36.net
>>201
defineされてようが複数のフラグをand/or で繋いだりするのは桁で管理してるからじゃん

204 :デフォルトの名無しさん :2022/11/23(水) 00:20:21.73 ID:E00oDXjza.net
chmodとかどうやってんの

205 :デフォルトの名無しさん :2022/11/23(水) 00:43:41.07 ID:cGYFLLo00.net
さっきのビット演算、XOR 使うってことは
key によって特定のビットをトグルで ON/OFFする処理
の一部を抜粋した様に見える

206 :デフォルトの名無しさん :2022/11/23(水) 05:44:17.85 ID:agXFLOTv0.net
>>196
ご冗談を

207 :デフォルトの名無しさん :2022/11/23(水) 08:43:03.58 ID:g5bfG+kA0.net
>>201
複数フラグを同時に使う時は FlagA | FlagB とかやるんだが意識してないお前はどうやってるんだ?w

208 :デフォルトの名無しさん :2022/11/23(水) 09:08:55.00 ID:a3Z+vFOW0.net
>>192
>二進数で 1001 ^ 1100 は 0110 になる

いまさらだけどここ間違えたわ

「二進数で 1001 ^ 1100 は 0101 になる」が正しい

209 :はちみつ餃子 :2022/11/23(水) 10:34:19.99 ID:TBut/iDU0.net
現代的な C++ なら std::byte とか std::bitset を使って欲しいところではある。

210 :デフォルトの名無しさん :2022/11/23(水) 12:32:20.17 ID:A/L1k8HF0.net
std::byte なんてあるんだ

211 :デフォルトの名無しさん :2022/11/23(水) 12:34:44.63 ID:DxhXFxCJa.net
istringstreamとかifstreamとかistreamとか
入力系からreadした場合実際に読めたバイト数は
.gcount()で取得出来ますが
ostringstreamとかofstreamとかostreamとか
出力系にwriteした場合実際に描き込めたバイト数はどうすれば取得出来ますか?
.pcount()とかは無いようです

212 :デフォルトの名無しさん :2022/11/23(水) 12:40:51.08 ID:fdWr7Y/z0.net
writeに文字数与えてるだろ?成功したらその数だよ
失敗したら未定義

213 :デフォルトの名無しさん :2022/11/23(水) 12:46:45.47 ID:DxhXFxCJa.net
Nを指定して成功していたら必ずNは判りますが
未定義: 失敗したとき0かどうかは判らない
定義済(0): 0からNの間の値になる可能性は無い
の未定義にあたるということですかね
途中までならその途中までの数字が知りたいと思うのは不自然?
ありがとうございます

214 :デフォルトの名無しさん :2022/11/23(水) 13:01:17.94 ID:KaofbnpA0.net
write(2)じゃなくてfputs(3)に相当するから
書き込んだバイト数なんて概念はないのでは

215 :デフォルトの名無しさん :2022/11/23(水) 13:59:19.61 ID:fdWr7Y/z0.net
書き込みエラーなんてプログラムからは何が起きてるかわかんないんだよ
最悪壊れかけのディスクにちょうどトドメ刺して何もかも吹っ飛んだのかもしれない
エラーが起きた時点でプログラム側で保証できることなんてほとんどないし、たまたま途中の何文字まで書けたかなんて大抵は無意味な情報

逆に読み込みで何文字読んだって情報は、プログラム側で管理してるメモリの話だからプログラムからも分かるし必要でもある

216 :デフォルトの名無しさん :2022/11/23(水) 14:04:25.04 ID:8VVNMMLlr.net
テキストアライメント関係の 始端よせ/中央/終端よせ の類で
0~3の 2 bit値を ビットパターンマスクの途中に織り込んでくるのはどっきりする

217 :デフォルトの名無しさん :2022/11/23(水) 23:37:54.49 ID:t8T/jR0m0.net
質問なのですがenum class初心者なのですが
enum classはint以外の整数型としても定義できるそうなので
整数型への自動変換ぐらいしてくれるのかと思いきや、
 enum Foo { A, B, C, D, N };
 int arr[Foo::N];
 arr[Foo::A] = 1;
 arr[Foo::B] = 999;
みたいに配列の添え字に使うケースで
 error C2677: 二項演算子 '[': 型 'Foo' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
というコンパイルエラーになります……orz
Visual Studio 2019なのですがおれ環?

218 :デフォルトの名無しさん :2022/11/23(水) 23:45:44.60 ID:MlF8tgQAd.net
enum class Fooって書いてみやがれ

219 :デフォルトの名無しさん :2022/11/23(水) 23:54:39.59 ID:g5bfG+kA0.net
>>217
配列インデックスに利用できない
https://monozukuri-c.com/langcpp-funclist-enum-class/

220 :デフォルトの名無しさん :2022/11/24(木) 00:25:30.42 ID:WosJnlmu0.net
レス㌧クス
なるほどキャスト必須ですか、、、
Fooへの整数の代入だけエラーになるのかと思ったら
思ってたのと違う……

221 :デフォルトの名無しさん :2022/11/24(木) 01:18:48.76 ID:4/0XLjMc0.net
スコープを限定したいときは以下のように俺は書いてるな

namespace Foo
{
enum { A, B, C, D, N };
}

int main ()
{
struct Bar
{
enum { A, B, C, D, N };
};
int arr0[Foo::N];
arr0[Foo::A] = 1;
int arr1[Bar::N];
arr1[Bar::A] = 1;
return 0;
}

222 :デフォルトの名無しさん :2022/11/24(木) 01:41:40.71 ID:4/0XLjMc0.net
>>221 は忘れてくれ
寝ぼけてた

223 :はちみつ餃子 :2022/11/24(木) 02:01:14.76 ID:7DmT43os0.net
>>217
enum class といいつつ enum で宣言しているところをみるに、
ひょっとして enum と enum class が別物であることを知らずに混乱しているのでは?
ちなみに enum class も class というキーワードを使いはするが分類上はクラスではないのも混乱するかもな。

> enum classはint以外の整数型としても

たぶん underlying type のことを言っているんだと思うが
指定しなかったときの underlying type は int ではなく
その列挙体における全ての列挙子を格納可能な処理系定義のなんらかの整数としか決まってない。
(格納可能である限りは int より大きくなることはないという制約はついているけど。)

224 :デフォルトの名無しさん :2022/11/24(木) 06:18:15.26 ID:0c/PVttN0.net
>>223
> 指定しなかったときの underlying type は int ではなく
> その列挙体における全ての列挙子を格納可能な処理系定義のなんらかの整数としか決まってない。
> (格納可能である限りは int より大きくなることはないという制約はついているけど。)
それunscoped enumeration typeの方
enum class は無指定だと int になる
https://cpprefjp.github.io/lang/cpp11/scoped_enum.html

225 :デフォルトの名無しさん :2022/11/24(木) 08:03:44.62 ID:WosJnlmu0.net
>>223
>>217でenum Fooと書いたのはenum class Fooの誤記でしたサーセン;;;;
enum classを自動では整数型に変換してくれないのはやっぱおれ環?

226 :デフォルトの名無しさん :2022/11/24(木) 08:35:12.79 ID:0WkgaUasa.net
>>225
おれ環ではなくて仕様

227 :デフォルトの名無しさん :2022/11/24(木) 08:57:54.29 ID:rMCXw8Tu0.net
C++の言語仕様を決めてる人たちの考えとしては
配列とハッシュはまったく異なる概念なので分けて使うようにってことですか?

228 :デフォルトの名無しさん :2022/11/24(木) 09:08:45.63 ID:AuoRjAvpd.net
逆に聞きたいが
配列とハッシュが同じカテゴリに入ることなんてあるのか?

229 :デフォルトの名無しさん :2022/11/24(木) 09:20:49.08 ID:qRYWlPaYd.net
enumはいらないこ

230 :はちみつ餃子 :2022/11/24(木) 11:00:48.22 ID:7DmT43os0.net
歴史的経緯というやつだなぁ。
C では列挙子の型が int なんだよ。 列挙型は定義ごとに独立した型になるのに列挙子は整数そのものとして扱われる。
C++ では列挙子の型は列挙型に変更しつつも型変換がゆるゆるだから結果的に C とほぼ同じ挙動になって互換性が維持された。

あまりよくはないが C との連携は C++ の強みだから仕方がない。
でもさすがに扱いにくいから新しく enum class が作られたという経緯なので最初から使い分けを意図して二種類作られたわけではない。
enum の改良として enum class が出来たので一貫性がなく全く別物として成立している。

231 :デフォルトの名無しさん :2022/11/24(木) 12:09:29.22 ID:rMCXw8Tu0.net
>>228
PerlのハッシュはC++ではmapやsetっていうんだね
ただ今勉強中で頓珍漢なこと言ってしまった、すいません

232 :デフォルトの名無しさん (テテンテンテン MM8e-IwB9):2022/11/24(木) 12:23:01.01 ID:hRuvaNsTM.net
>>231
mapは写像、setは集合が大本の概念だからな。

Hashはハッシュ関数という写像の一種だから、正確には同じじゃない。

233 :デフォルトの名無しさん :2022/11/24(木) 12:57:58.38 ID:ggwtZAtna.net
dictがいいね

234 :デフォルトの名無しさん :2022/11/24(木) 14:33:18.54 ID:CXfVk4LxH.net
ハッシュを使ってマップ(対応付)ってことよね

235 :デフォルトの名無しさん :2022/11/24(木) 15:31:29.44 ID:a85Uy2KJM.net
簡単そうに見えたけど、俺の中でなかなか理解できないのが explicit 指定。
明示的初期化、直接初期化、代入初期化(?)、暗黙の型変換の禁止、
などなど色々な概念があるし、頭の中で整理できてない。
「直接初期化」の定義が今一分かって無い。

236 :はちみつ餃子 :2022/11/25(金) 09:44:10.24 ID:9Oo+WeOy0.net
>>235
もちろん色々な概念と相互に関係はあるんだが explicit 指定に直接的に関連するルールは

・ 引数一個で呼び出せるコンストラクタ (デフォルト引数や可変長引数の場合も含む) は変換コンストラクタ (converting constructor) としても機能する
・ ただし explicit 指定がついている場合はそうならない

ってだけだな。
変換コンストラクタがいつ起動するのかはまた別の話として……。

237 :デフォルトの名無しさん :2022/11/25(金) 11:20:20.74 ID:rtODN+wBd.net
C++03まではそうだったけど
11から複数引数にも波括弧からの変換を認めない機能が追加されてややこしくなってる

struct Hoge{
 /*explicit*/ Hoge(int,double,char*);
 …
};
Hoge foo(){
 return {42,3.14,”Hello”); // explicitだとダメ
}
Hoge h[] = { {1,1.0,””}, {2,2.0,””}}; //explicitだとダメ

238 :デフォルトの名無しさん :2022/11/25(金) 12:30:00.19 ID:PV2ZG9bua.net
ハッシュを使って実現した連想配列をハッシュって呼ぶのは
携帯電話をケータイと呼ぶような類のこと

239 :デフォルトの名無しさん :2022/11/25(金) 12:43:43.65 ID:hG6NI52YM.net
>>238
誤用の無い範囲で用語を混同するのは理工学じゃ普通。

240 :デフォルトの名無しさん :2022/11/25(金) 12:47:02.94 ID:PV2ZG9bua.net
>>237
こういうこと?
#include <iostream>
using namespace std;

struct Hoge{
int a;
double b;
char *c;
explicit Hoge(int _a, double _b, char *_c) : a(_a), b(_b), c(_c) {}
};

Hoge foo(){
return Hoge{42, 3.14, "Hello"};
}

Hoge h[] = {Hoge{1, 1.0, ""}, Hoge{2, 2.0, ""}};

int main() {
return 0;
}

241 :デフォルトの名無しさん :2022/11/25(金) 12:48:02.39 ID:PV2ZG9bua.net
>>237
>>240 なら通るって意味ね
https://ideone.com/zBKL6Z

242 :はちみつ餃子 :2022/11/25(金) 12:50:26.80 ID:9Oo+WeOy0.net
そのへんの仕様を何度も読んだことは記憶にあるのに内容はなんも覚えとらん。
実際わかりにくいと思うわ。

243 :デフォルトの名無しさん :2022/11/25(金) 14:21:14.78 ID:TzWxad5dM.net
今まで本を読んでも、「直接初期化」「コピー初期化」
の厳密定義が分からなかったけど、英語版の en.cppreference.com
をそれぞれ
「direct initialization」「copy initialization」
で検索すると「全てのパターン(?)」の一覧が出てくるみたいだ。

244 :デフォルトの名無しさん :2022/11/25(金) 14:30:36.00 ID:rtODN+wBd.net
>>241
それはただのHogeのコピー
波括弧からの暗黙変換を禁止するのがexplicit

245 :デフォルトの名無しさん :2022/11/25(金) 14:32:53.51 ID:rtODN+wBd.net
あ、第3引数const char*じゃないとダメだったすまん

246 :デフォルトの名無しさん :2022/11/25(金) 18:47:26.18 ID:H2Sh2jTOd.net
>>231
ハッシュは数学的な関数で
辞書とは根本的に違うぞ

247 :デフォルトの名無しさん :2022/11/25(金) 20:26:20.13 ID:HZEumDr50.net
>>246
しつこい、Perl では連想配列をハッシュと言ってるんだからいちいち数学的とが絡んでくるなよ
https://perldoc.jp/docs/perl/5.36.0/perldata.pod

248 :デフォルトの名無しさん :2022/11/25(金) 20:32:13.35 ID:kbwNStuYp.net
C++スレなんだがw

249 :デフォルトの名無しさん :2022/11/25(金) 20:51:44.30 ID:v7fq4Pg10.net
不条理スレだろ

250 :デフォルトの名無しさん :2022/11/25(金) 20:59:11.33 ID:/ARUt2jFa.net
一方的と連想が関係ないとかちょっと

251 :デフォルトの名無しさん :2022/11/25(金) 21:16:26.19 ID:3wykxWfs0.net
ハッシュテーブルとかも知らなさそう

252 :デフォルトの名無しさん :2022/11/25(金) 22:15:24.17 ID:mXzsiLHg0.net
>>247
しつこいって、こっちから意見を述べたのはこれが最初なんだが??
PerlではどうたらをC++スレで押しつけようとしているおまえさんこそ
しつこそうだぞ
嫌なら出てけよ、余所者

253 :デフォルトの名無しさん :2022/11/25(金) 22:37:42.42 ID:RzATrhyN0.net
explicit……
ある型を別の型にするコンストラクタを定義したのだけど
暗黙の型変換は辞めて欲しいときに使う(使った

254 :デフォルトの名無しさん :2022/11/25(金) 22:41:33.27 ID:mXzsiLHg0.net
C++スレでPerlマウント取りに来たの?
ダサすぎwww 本国で相手されないからってするに事欠いて、ちったあ恥を知れよ

255 :デフォルトの名無しさん :2022/11/25(金) 22:44:15.86 ID:HZEumDr50.net
>>252
アスペか?
>>228 は単に勉強不足だって書いてるのに押し付けるとか頭おかしい

256 :デフォルトの名無しさん :2022/11/25(金) 23:04:39.42 ID:UZlFL5FW0.net
ここはC++のスレです

257 :デフォルトの名無しさん :2022/11/25(金) 23:06:31.95 ID:RzATrhyN0.net
> >>231
> ハッシュは数学的な関数で
> 辞書とは根本的に違うぞ
之大いに我が意を得たり

ハッシュ関数使わなくても連装配列実装できるもん遅いけど
ていうかハッシュが衝突したらそこから先は線形探索か何か(通常の実装では
なので連装配列をハッシュと呼ぶ風潮は嘆かわしいPerlerの端くれだけど

258 :デフォルトの名無しさん :2022/11/25(金) 23:19:03.90 ID:AKMJjhwVH.net
>>257
>そこから先は線形探索か
ダブルハッシュですよ普通は
つまりまずは違うハッシュ関数を使いますね、それからやっと線形探索かな

259 :デフォルトの名無しさん :2022/11/25(金) 23:59:25.23 ID:mXzsiLHg0.net
>>255
医学用語持ち出して感情に働きかけるあたり
論理思考が苦手そうな方ですね

ご自慢のPerlを自ら貶めていることにお気づき召されよう・・・

260 :デフォルトの名無しさん :2022/11/26(土) 04:52:09.51 ID:rUW0f5oN0.net
医学用語?
ネットスラングやぞw
----
ネットスラングなので明確な定義はなく、用法は人によるところだが、おおむね下記のような人間を指すことが多い。
■コミュニケーションが苦手(コミュ障):話や文章の理解力が乏しい、円滑な意思疎通が困難、空気が読めない、相手の感情を察知できない。
■拘りが強い:些細な間違いを指摘し揚げ足を取る、自分の作ったものに手を加えられるのを嫌う(ここやwikiで言う自治厨)、理想とするパターンをもっておりそれを邪魔されるとヒステリックになる。
■短気:上記のような過ちを指摘されると反射的に逆上する。
■独善的:ロジカルシンキングが出来ず自分が悪いという思考に思い至らない。
https://dic.pixiv.net/a/%E3%82%A2%E3%82%B9%E3%83%9A

261 :デフォルトの名無しさん :2022/11/26(土) 07:25:12.45 ID:iOeKRej80.net
医師免許持ってないやつが診察するなよ。

262 :デフォルトの名無しさん :2022/11/26(土) 07:29:45.15 ID:JBLsurgz0.net
Perl厨はカナー症候群かw

263 :デフォルトの名無しさん :2022/11/26(土) 08:13:50.52 ID:rUW0f5oN0.net
>>262
> 医学用語持ち出して感情に働きかけるあたり
> 論理思考が苦手そうな方ですね

264 :デフォルトの名無しさん :2022/11/26(土) 08:45:08.96 ID:JBLsurgz0.net
へー、カナーと言われて傷ついてんのかw

265 :デフォルトの名無しさん :2022/11/26(土) 08:47:44.37 ID:JBLsurgz0.net
ハッシュとはそもそも何かがわかってなくて頓珍漢なこと言って恥かいたやつは
こういう低レベルな煽り合いになると喜んでついて来やがる

266 :デフォルトの名無しさん (ワッチョイ f77c-PVVO):2022/11/26(土) 09:09:52.76 ID:Q1Vkq5Eh0.net
そもそもC++ではそのデータ構造のことunordered_mapって呼ぶんですよ
スレ違いやめてください

267 :デフォルトの名無しさん :2022/11/26(土) 09:32:30.94 ID:ClD6WYXHa.net
>>265
自己紹介は要らんよ

268 :デフォルトの名無しさん :2022/11/26(土) 10:07:14.70 ID:B3T+QFuSa.net
最近の人はハッシュと言えば#しか思い浮かばんだろうから
perlの連想配列とか#hoge{'fuga'}とか描いてバグ理想

269 :デフォルトの名無しさん :2022/11/26(土) 10:07:55.88 ID:c2ia0w6pd.net
昼飯はハヤシにすっかな

270 :デフォルトの名無しさん :2022/11/26(土) 10:19:15.89 ID:qL7kB8pFa.net
perl界隈で連想配列のことハッシュとか言ってる人知らないな
何十年も前からみんな連想配列連想配列言ってたでしょ
最近はハッシュって呼ぶ人もいるのかな?

むしろRubyの方なら昔から組み込みライブラリに
その名も Hash っていうそのまんまのクラスがあるから分かるけど

271 :デフォルトの名無しさん :2022/11/26(土) 10:36:56.47 ID:39+gXbIT0.net
いちいち連想配列って言ってる人を逆に見かけたことないが。perl用語ではhashなんだし。

272 :デフォルトの名無しさん :2022/11/26(土) 10:41:58.99 ID:rUW0f5oN0.net
>>270
まだやるの?
公式がハッシュって言ってるのになに言ってるんだよ

Perl has three built-in data types: scalars, arrays of scalars, and associative arrays of scalars, known as "hashes".
https://perldoc.perl.org/perldata#NAME

273 :デフォルトの名無しさん :2022/11/26(土) 10:48:53.00 ID:qL7kB8pFa.net
そうなん?(ヽ´ω`)

ちなみに手元のラクダ本1993年発行には

> P.37 この章の最後を締めくくる話題は連想配列である。
> 連想配列を自在に使いこなせるようにならなければPerlを究めたとは言えない。
> (略)連想配列を使えば(略)連想配列は(略)連想配列から(略)
> これが連想配列(略)連想配列も(略)連想配列全体を表すには(略)

とあるわ

274 :デフォルトの名無しさん :2022/11/26(土) 10:56:49.67 ID:B3T+QFuSa.net
ラクダは連想配列だよな
何時からか知らんが#が主流になった
糞Javaの影響かも知れん
使い方で世代が判るんじゃね
知らんけど

275 :デフォルトの名無しさん :2022/11/26(土) 10:57:15.80 ID:Q1Vkq5Eh0.net
Perlerども消えてください

Perlについての質問箱 65箱目
http://mevius.5ch.net/test/read.cgi/tech/1616856733/

276 :デフォルトの名無しさん :2022/11/26(土) 11:00:18.64 ID:B3T+QFuSa.net
>>272
>associative arrays of scalars, known as "hashes"

まともな英語力あるなら
連想配列が主でハッシュが副だと読めるだろ

277 :デフォルトの名無しさん :2022/11/26(土) 11:07:56.03 ID:qL7kB8pFa.net
>>274
Map的なものに対する呼び方で
その人のバックグラウンドが透けて見えて少し面白いよね
map ←C++
連想配列 ←Perl
Hash ←Ruby
Map, Hashtable ←Java
Dictionary, Hashtable ←C#

278 :デフォルトの名無しさん :2022/11/26(土) 11:08:03.90 ID:39+gXbIT0.net
>>276
そのページで associative array と書いているのはその一か所だけで、
あとは全部 hash と呼んでいるのは見りゃわかるだろ。

279 :デフォルトの名無しさん :2022/11/26(土) 11:09:06.09 ID:rUW0f5oN0.net
>>276
「ハッシュとして知られている」な
理解力無さすぎだろw

280 :デフォルトの名無しさん :2022/11/26(土) 11:14:43.16 ID:OEFvMG4I0.net
いつまでやんの?
このねた

281 :デフォルトの名無しさん :2022/11/26(土) 11:45:12.56 ID:Q1Vkq5Eh0.net
hash table→associative array→map→dictionaryの順に抽象度が高い呼び方なだけで、どれが合ってるとか優れてるとかいう話じゃないね
hashは略し過ぎで誤解や混同を招くバカ丸出しの呼び方だと思うけど、それで定着しちゃってるバカ言語はしょうがないから使い続ければいいと思うよ
だからバカ言語erは帰ってくれないか

282 :デフォルトの名無しさん :2022/11/26(土) 11:48:39.97 ID:B3T+QFuSa.net
>>279
「ハッシュとして知られているがPerlでは連想配列と呼ぶ」なんだよ

283 :デフォルトの名無しさん :2022/11/26(土) 12:04:14.67 ID:rUW0f5oN0.net
>>282
>>278
恥の上塗り乙

284 :デフォルトの名無しさん :2022/11/26(土) 13:22:00.66 ID:H/gEJifTd.net
>>267
自己紹介なんかしとらんよ
ハッシュで恥かいたのはおまえだけだ

技術板でねらー語だけのレスしか
できなくなってる惨めなザマ晒してろ

285 :デフォルトの名無しさん :2022/11/26(土) 13:37:37.86 ID:rUW0f5oN0.net
恥かいた上に粘着w

286 :デフォルトの名無しさん :2022/11/27(日) 10:42:16.60 ID:Kt25DdLnM.net
std::setw は例えば整数 1 つ出力すると設定がリセットされますが std::setprecision
は持ち越されますよね

この辺の法則性というか思想みたいなものってありますか?一々調べるか試すかしかないですかね

287 :デフォルトの名無しさん :2022/11/27(日) 11:24:38.52 ID:/D4jQIUG0.net
マニピュレータはストリームオブジェクトの状態を永続的に変えるのが基本的なコンセプトのはずだけど
なぜかsetwだけ例外で当初から叩かれてる
iostreamは色々と設計がいいかげんだからそういうものだと思って付き合うしかない

288 :はちみつ餃子 :2022/11/27(日) 11:45:00.03 ID:VcW73S9v0.net
>>286
リセットというか厳密に言うと operator<< (または operator>>) のオーバーロードの内で width(0) を呼ぶことになっているものがある。
他に勝手に状態が変更されるものは書かれていないっぽいので例外的な処置だなぁ。

289 :デフォルトの名無しさん :2022/11/27(日) 12:51:03.79 ID:cvPOxMca0.net
>>285
それこそを自己紹介というのだ

290 :デフォルトの名無しさん :2022/11/27(日) 13:53:49.92 ID:Tzlpv0SL0.net
> 自己紹介なんかしとらんよ
> ハッシュで恥かいたのはおまえだけだ
> 技術板でねらー語だけのレスしか
> できなくなってる惨めなザマ晒してろ
でっかいブーメラン刺さってんぞw

291 :デフォルトの名無しさん :2022/11/27(日) 14:00:32.19 ID:Tmh9iNo1d.net
>>272
語るに堕ちるとはまさにこの事。
おまいの主張なら、
Perl has three built-in data types: scalars, arrays of scalars, and hashes.
と書かれていなければならない。

292 :デフォルトの名無しさん :2022/11/27(日) 14:28:03.11 ID:Tzlpv0SL0.net
>>291
まだ恥かくの?
とりあえず>>278にレスしてから出直してこいよw

293 :デフォルトの名無しさん :2022/11/27(日) 14:29:32.31 ID:IMKjsn3Ja.net
馬鹿に馬鹿って指摘すると発狂するから面白い

294 :デフォルトの名無しさん :2022/11/27(日) 15:28:11.27 ID:fQNWVuiS0.net
>>292
単純にhashのほうが短くて書きやすいからじゃないの?

295 :デフォルトの名無しさん :2022/11/27(日) 15:53:37.14 ID:/VbNuLIvd.net
ここC++すれだぜ

296 :デフォルトの名無しさん :2022/11/27(日) 16:00:27.20 ID:Tzlpv0SL0.net
>>294
まあ理由としてはそれもあると思うよ
Perlでは連想配列をハッシュと呼んでいるという結論は変わらんけど

297 :デフォルトの名無しさん :2022/11/27(日) 16:05:04.48 ID:/VbNuLIvd.net
>>295

298 :デフォルトの名無しさん :2022/11/27(日) 16:20:02.06 ID:IMKjsn3Ja.net
>>281

299 :デフォルトの名無しさん :2022/11/27(日) 16:21:52.60 ID:/VbNuLIvd.net
いい加減他行けよ

300 :デフォルトの名無しさん :2022/11/27(日) 16:28:16.04 ID:cvPOxMca0.net
HDDを指さしてメモリと言うやつが実在したけど
アレと同じだな

301 :デフォルトの名無しさん :2022/11/27(日) 16:31:00.38 ID:cvPOxMca0.net
>>290
だから何?

既出リストとチェックサムを混同していた
恥ずかしい恥ずかしい「自称技術屋」さんよ

302 :デフォルトの名無しさん :2022/11/27(日) 16:53:39.58 ID:MLqxhNeWa.net
どうでもいいのは十分承知
スレ違いも痛感してる

comp.lang.perlへの、とあるオッサンの投稿

https://groups.google.com/g/comp.lang.perl/c/NyYms98cjAY/m/BsGQNfVSZz8J?pli=1
> Doing linear scans over an associative array is like trying to club someone
> to death with a loaded Uzi.
> Larry

associative array( ー`дー´)キリッ
はいわかってますすみませんでしたこれで終わりです

303 :デフォルトの名無しさん :2022/11/27(日) 17:07:40.09 ID:Tzlpv0SL0.net
>>301
> 既出リストとチェックサムを混同していた
それこそ誰と「混同」してるんだよw
だから何?とか言う前に言う先を見直せよ

304 :デフォルトの名無しさん :2022/11/27(日) 22:34:21.89 ID:Tgiu0YbR0.net
みんなunordered_map使ってる?

305 :デフォルトの名無しさん :2022/11/27(日) 23:37:16.27 ID:6x5lNRGr0.net
>>302
どこの馬の骨かわからないおっさん……

306 :デフォルトの名無しさん :2022/11/28(月) 01:11:46.10 ID:333njSggM.net
>>287
>>288
マニピュレータはそんなに色々使ったことあるわけじゃなかったんですけどたまたま setw が例外的な立ち位置だったんですね、ありがとうございます!

307 :デフォルトの名無しさん :2022/11/28(月) 05:38:40.30 ID:gON1d6gf0.net
宇治茶を入れたら死ぬたらどうたら、意味わからん

308 :デフォルトの名無しさん :2022/11/28(月) 06:10:25.20 ID:SRny5TUK0.net
>>303
あー、何のことかガチでわからんのね

309 :デフォルトの名無しさん :2022/11/28(月) 06:41:10.27 ID:um60po1f0.net
言ってもない事で言いがかりつけてきて
> あー、何のことかガチでわからんのね
とか言われても...
基地害に絡まれたことしかわからんw

310 :デフォルトの名無しさん (スプッッ Sd3f-Is/7):2022/11/28(月) 07:28:14.81 ID:FI+f6bGtd.net
とぼけられることは抜け目なくとぼけるね
見苦しさは1ミリも減らんけど

311 :デフォルトの名無しさん :2022/11/28(月) 08:08:56.53 ID:TnOYpck5M.net
とりあえずコテ入れろよ。
NG設定するから。

312 :デフォルトの名無しさん :2022/11/28(月) 08:20:43.37 ID:FI+f6bGtd.net
本質が解ってないから誰かの言い間違いや嘘を
完全に信じてしまいドヤ顔で他人にひけらかすやつが
配列はハッシュと強弁してるだけ
結局みんな匙投げたwww

313 :デフォルトの名無しさん :2022/11/28(月) 09:17:21.88 ID:um60po1f0.net
公式ドキュメントを誰かの嘘や言い間違いとか言うアホ
なお>>278にはレスできないのでガン無視してるのが草

314 :デフォルトの名無しさん :2022/11/28(月) 12:28:37.35 ID:Hx2PBBJld.net
読んでないけど、配列は誰が何と言おうと断じてハッシュではない

315 :デフォルトの名無しさん :2022/11/28(月) 12:32:38.95 ID:LDNjf6uN0.net
連想配列の話だったのに?

316 :デフォルトの名無しさん :2022/11/28(月) 12:40:00.21 ID:W5LCj1xRd.net
operator[]できりゃ配列 VS 組み込み配列以外認めない
ファイ!

317 :デフォルトの名無しさん :2022/11/28(月) 13:02:13.69 ID:y4obDsJqd.net
C++のスレだからC++の配列の話に決まってる

318 :デフォルトの名無しさん :2022/11/28(月) 13:20:57.67 ID:um60po1f0.net
>>315
引っ込みつかなくなって配列と連想配列の違いなんてどうでもよくなってるんだろw

>>317
その方向に必死に軌道修正してるのかもね

319 :デフォルトの名無しさん (スプッッ Sd3f-Is/7):2022/11/28(月) 18:40:08.47 ID:M6XGVi6zd.net
配列とは有限の連続した区間の整数と
その整数に対応する数学的に導けるとは限らない値を
関連付ける辞書だ

ハッシュは任意の整数列から数学的に導かれる値だ

誰が何と言おうとどうにもならない違いがある

320 :デフォルトの名無しさん :2022/11/28(月) 18:51:48.08 ID:0bwybHojp.net
配列ってポインターの劣化版だろ?

321 :デフォルトの名無しさん :2022/11/28(月) 19:01:32.43 ID:M2C6hA1cd.net
それはC限定の狭い理解だ
本質的にはメモリそのもの

322 :デフォルトの名無しさん :2022/11/28(月) 19:05:57.64 ID:LDNjf6uN0.net
ポインタと言えば C言語以来だが、対象の型を宣言するし
最初からポインタ配列なんてのもあるし、そこに優劣は無い

323 :デフォルトの名無しさん :2022/11/28(月) 19:18:42.45 ID:um60po1f0.net
>>319
誰も同じなんて言ってないぞ、頭大丈夫?w

324 :デフォルトの名無しさん :2022/11/28(月) 19:48:51.72 ID:o1Lo2Y40d.net
>>323
おまえさん誰だ?
とぼけるやつとは話にならんなあ

325 :デフォルトの名無しさん :2022/11/28(月) 19:58:56.64 ID:XzS7ufqna.net
ハッシュドビーフと同じ?

326 :デフォルトの名無しさん :2022/11/28(月) 20:00:17.05 ID:um60po1f0.net
>>324
> おまえさん誰だ?
なにとぼけてるんだよw

> とぼけるやつとは話にならんなあ
確かにな

327 :デフォルトの名無しさん :2022/11/28(月) 20:06:12.94 ID:107q+t+0d.net
WindowsライクのOS、ReactOSで見つけたハッシュの実装例:
https://github.com/reactos/reactos/pull/4916/files

見ればわかるように、ハッシュ関数は自分で作れるんだぜ。

328 :デフォルトの名無しさん :2022/11/28(月) 20:09:24.29 ID:107q+t+0d.net
https://github.com/reactos/reactos/blob/92119af8bd36fc482d893ad09d1e77d4f9487f60/win32ss/gdi/ntgdi/freetype.c#L3116
これがハッシュ関数。

329 :デフォルトの名無しさん :2022/11/28(月) 20:18:51.32 ID:GH6cEocnd.net
unsigned hash = 0;
for_each(container.begin(),container.end(),[&](auto x){hash += x;});
これでもハッシュには違いない
衝突耐性の制約がなければ自作なんて誰でもできる

330 :デフォルトの名無しさん :2022/11/28(月) 20:22:10.24 ID:wrNBfZfE0.net
>>325
一緒やで
切り刻んだ牛肉の料理がハッシュドビーフで、オブジェクトを切り刻んで固定長の値にするのがハッシュ関数や

331 :デフォルトの名無しさん :2022/11/28(月) 20:28:41.55 ID:GDVe/V0ep.net
程よく刻んで一定長の値になるから
分類キーにしたりするんだろ?

332 :デフォルトの名無しさん :2022/11/28(月) 20:50:49.09 ID:SRny5TUK0.net
>>322
ポインタ配列??? おまえは何を言っているんだ?

333 :デフォルトの名無しさん :2022/11/28(月) 20:53:13.19 ID:LDNjf6uN0.net
>>332
ポインタの配列

334 :デフォルトの名無しさん :2022/11/28(月) 20:55:34.01 ID:pf+ZrZrvp.net
配列やポインターの指してる中身が何かは今関係ないんだがなぁw

335 :デフォルトの名無しさん :2022/11/28(月) 21:53:05.48 ID:iNOjxk3Aa.net
ちなみにJavaならハッシュって言うと
java.util.Hashtableよりも
java.lang.Object#hashCode()の話に聞こえちゃうよね(;^ω^)
あとどんな型でも配列にできるんだから
ポインタの配列を「ポインタ配列」などと区別して呼ぶのは珍妙よね

>>325
ココイチのハッシュドビーフうまいよね

336 :デフォルトの名無しさん :2022/11/28(月) 22:04:34.92 ID:um60po1f0.net
>>335
> ポインタの配列を「ポインタ配列」などと区別して呼ぶのは珍妙よね
文字配列とか整数配列とかも珍妙かね?

337 :デフォルトの名無しさん :2022/11/28(月) 22:17:15.58 ID:SRny5TUK0.net
配列の要素が何であろうが配列は断じてハッシュではないことは微動だにしない

338 :デフォルトの名無しさん :2022/11/28(月) 22:19:20.24 ID:LDNjf6uN0.net
>>320
どさくさに紛れて「配列ってポインターの劣化版だろ?」
という戯言があったから反応しただけだよ

339 :デフォルトの名無しさん :2022/11/28(月) 22:23:15.16 ID:um60po1f0.net
>>337
>>323

340 :デフォルトの名無しさん :2022/11/28(月) 22:29:19.11 ID:SRny5TUK0.net
>>339
そうか、同じではないのか
で? 配列はキャッシュなのか? どうなんだ? はっきりしろよ

341 :はちみつ餃子 :2022/11/28(月) 22:40:32.85 ID:26iHAu1B0.net
ハッシュテーブルの実装に配列を使うのはごく普通のことなので「∃配列 ∈ハッシュテーブル」とは言える。
それを縮めて「配列がハッシュ」と表現する程度のことは文脈によっては自然言語的にはまあ珍しくは無い程度のもんだろ。
よくない表現だとは強く思うけどもあり得ないというほどではないんじゃないの。

342 :デフォルトの名無しさん :2022/11/28(月) 22:42:39.73 ID:iNOjxk3Aa.net
( ;・`д・´)ナ、ナンダッテー!!(`・д´・(`・д´・; )
終わりかけたに見えたスレ違い展開に
ここにきてキャッシュが参戦

343 :デフォルトの名無しさん :2022/11/28(月) 22:51:20.41 ID:SRny5TUK0.net
まさか餃子がこう来るとは思ってなかった
見損なった

344 :はちみつ餃子 :2022/11/28(月) 22:54:19.16 ID:26iHAu1B0.net
繰り返すけど良くはないよ。
良くはない言い回しだけど自然言語ではその程度のブレは有るものなんだから
ある程度は前後の状況で察していくしかしょうがないだろう。

まあ今回は察した結果として最初に言い始めたやつはなんか勘違いしているっぽくはあるとは思うけど。

345 :デフォルトの名無しさん :2022/11/28(月) 22:54:20.53 ID:um60po1f0.net
キャッシュがわざとなのかハッシュを間違えるほど取り乱してるのか判断できない...w

346 :デフォルトの名無しさん :2022/11/28(月) 22:55:21.60 ID:SRny5TUK0.net
あ、言い間違えてた
キャッシュじゃねえハッシュだ

すまぬ >ALL

347 :デフォルトの名無しさん :2022/11/28(月) 23:15:54.31 ID:gEsuPeHf0.net
USBメモリをUSB
携帯電話を携帯

348 :デフォルトの名無しさん :2022/11/29(火) 00:38:09.61 ID:michHh0F0.net
>>341
C++の配列はハッシュと全く別のものですよ。
混同しないほうが良いです。

349 :デフォルトの名無しさん :2022/11/29(火) 00:53:29.42 ID:T02SHnLOa.net
>>348
論理学苦手そう

350 :デフォルトの名無しさん :2022/11/29(火) 05:48:41.57 ID:GFiCx/Of0.net
>>349
元レスの∃もようわからんけどな

351 :デフォルトの名無しさん :2022/11/29(火) 06:08:14.94 ID:4MUOq3YH0.net
>>348
混同してるのはお前を含めた一部の人だけ

352 :デフォルトの名無しさん :2022/11/29(火) 06:43:55.88 ID:fXD2KOR/d.net
>>347
一行めはメモリースティックかな

353 :デフォルトの名無しさん :2022/11/29(火) 07:19:39.74 ID:2jZTlsidd.net
>>348
C++の、なんて限定はいらんぞ

354 :デフォルトの名無しさん :2022/11/29(火) 08:22:10.19 ID:KTAWdqks0.net
ハッシュ関数で写像した値をインデックスにとる配列
ハッシュ関数が sha1 とか長い値を返すやつだとちとしんどい

355 :デフォルトの名無しさん :2022/11/29(火) 09:30:18.45 ID:H+GgH24Kd.net
sha1はクビになった

356 :デフォルトの名無しさん :2022/11/29(火) 09:40:28.73 ID:4MUOq3YH0.net
いわゆる要約関数と暗号学的ハッシュ関数は関連はあるけど用途が違う
どっちの関数の話かはたいてい文脈でわかるんだがたまに>>354みたいにハッシュという言葉だけに反応する奴が話をややこしくする

357 :デフォルトの名無しさん :2022/11/29(火) 09:43:15.93 ID:KTAWdqks0.net
どっちも衝突のリスクが低い多対1写像じゃん

358 :デフォルトの名無しさん :2022/11/29(火) 09:55:30.33 ID:4MUOq3YH0.net
用途が違う という言葉すら理解できないのか...

359 :デフォルトの名無しさん :2022/11/29(火) 10:03:21.99 ID:KTAWdqks0.net
同じだよ 単にその目的には向いてないってだけで

360 :デフォルトの名無しさん :2022/11/29(火) 10:13:02.00 ID:TCD94QPfa.net
だったら用途が違うんじゃないか?

361 :デフォルトの名無しさん :2022/11/29(火) 10:13:20.62 ID:4MUOq3YH0.net
だから用途の違うものを持って来て「ちとしんどい」とかアホすぎるって話なんだが...

362 :デフォルトの名無しさん :2022/11/29(火) 10:48:09.14 ID:IBwY0siX0.net
用途の違いとそれを使うときのしんどさは関係ないのでは?

363 :デフォルトの名無しさん :2022/11/29(火) 17:27:05.61 ID:USqQ0Gkfa.net
自然言語的にはそれくらいの幅があるってのには一理あるけど、
連想配列をハッシュ関数使ってなくても何でもハッシュと呼ぶのって
ゲームできる機械なら何でもファミコンって呼ぶのと同じくらいハズいよな。

364 :デフォルトの名無しさん :2022/11/29(火) 17:49:05.07 ID:0jENVbSE0.net
伝わるか伝わらないかで言えばまあ伝わるから、あとは言った人間が恥かくだけの問題
だからそれでいいんだ正しいんだってダダこねれば恥の上塗りするだけ
それで何とも思わないなら別にいいんじゃないの好きに呼べば

365 :デフォルトの名無しさん :2022/11/29(火) 18:22:39.82 ID:Eyv4OFhKd.net
おまいらスレタイ

366 :デフォルトの名無しさん :2022/11/29(火) 18:43:14.51 ID:4MUOq3YH0.net
>>363-364
まだやるの?
誰もPerlでの呼び方が良いなんて言ってなくて単に事実として公式ドキュメントでそう呼ばれてると言うだけの話なのでこんな所で恥ずいとか言ってないで公式に言ってやれよw

367 :デフォルトの名無しさん :2022/11/29(火) 19:12:17.63 ID:g0maKgnfa.net
>>366
perlはハッシュで連想配列を実装してるんだからperl公式がperlの連想配列をハッシュと呼んでも問題ないに決まってるだろ

368 :デフォルトの名無しさん :2022/11/29(火) 19:49:15.28 ID:4MUOq3YH0.net
誰も言ってない
> 連想配列をハッシュ関数使ってなくても何でもハッシュと呼ぶのって
とか言い出した奴にそんな事言われてもw

369 :デフォルトの名無しさん :2022/11/29(火) 20:17:42.05 ID:BXeP2+1aM.net
良くこんな話を続けられるなw

370 :デフォルトの名無しさん :2022/11/29(火) 21:16:53.89 ID:4UwuAQXt0.net
>>366
まだやるのをそのまま返す
配列はハッシュではない
おまえがそこでいくら粘っても覆ることは絶対にない
無駄でかつ迷惑な努力を今すぐやめろ
しつこいぞ貴様

371 :デフォルトの名無しさん :2022/11/29(火) 21:32:48.74 ID:18+vW8PY0.net
誰が馬鹿なのかなんて一目瞭然なんだから落ち着いてきたところで基地外に餌やるのやめなよ…

372 :デフォルトの名無しさん :2022/11/29(火) 21:33:00.88 ID:gIuDQpHWH.net
役に立つレスは >.277 のみ

Map的なものに対する呼び方で
その人のバックグラウンドが透けて見えて少し面白いよね
map ←C++
連想配列 ←Perl
Hash ←Ruby
Map, Hashtable ←Java
Dictionary, Hashtable ←C#

373 :デフォルトの名無しさん :2022/11/29(火) 21:34:00.99 ID:4MUOq3YH0.net
>>370
> 配列はハッシュではない
> おまえがそこでいくら粘っても覆ることは絶対にない
バカは人の話を聞いてないのか、それとも理解できないのか...

>>319
> 誰も同じなんて言ってないぞ、頭大丈夫?w

374 :デフォルトの名無しさん :2022/11/29(火) 22:02:10.73 ID:4UwuAQXt0.net
>>373
おまえの戯れ言を聞こうが聞くまいが関係ない
配列はハッシュではない

同じと言ってないのだな
で、配列はハッシュなのか? y/[N]

375 :デフォルトの名無しさん :2022/11/29(火) 22:23:48.34 ID:4MUOq3YH0.net
連想配列をハッシュと呼んでいるドキュメントがあるというだけの話なのに配列とか言い出すアホ乙

376 :デフォルトの名無しさん :2022/11/29(火) 22:51:06.76 ID:mBDoFEuP0.net
mapをhashと呼ぶのもAUTOだぞ。

377 :デフォルトの名無しさん :2022/11/29(火) 22:59:10.99 ID:4UwuAQXt0.net
>>375
で、配列はハッシュなのか? y/[N]

378 :デフォルトの名無しさん :2022/11/29(火) 23:04:55.01 ID:4MUOq3YH0.net
>>377
>>315

379 :デフォルトの名無しさん :2022/11/29(火) 23:09:48.89 ID:4UwuAQXt0.net
>>378
関係ない
で、配列はハッシュなのか? y/[N]

380 :デフォルトの名無しさん (ワッチョイ ffbb-NZIw):2022/11/29(火) 23:39:35.43 ID:JTTSm0Nf0.net
ハッシュ関数はなんて名前にしてるの?

381 :デフォルトの名無しさん :2022/11/30(水) 01:07:45.84 ID:TaPBZKHt0.net
仮想メモリのアドレス番号それ自体がハッシュの一種であるにより、ただの配列もハッシュであると断言できる

382 :デフォルトの名無しさん :2022/11/30(水) 02:43:16.08 ID:ZNMRPtWe0.net
>>379
これまでの話に「関係ない」質問をいきなりされてもねw

383 :デフォルトの名無しさん :2022/11/30(水) 07:26:27.66 ID:/Q74hFM3d.net
>>381
int a=1,b=1;
このとき&a!=&bで
おまえさんの言うハッシュは不一致だが
a!=bを証明しない

384 :デフォルトの名無しさん :2022/11/30(水) 08:02:03.99 ID:GLbLL33e0.net
ただの配列はアレイだろw

385 :デフォルトの名無しさん :2022/11/30(水) 08:19:43.48 ID:SGXzBjU4a.net
配列がハッシュだってのは、a[0]とa[1]は0とか1っていうアドレスにあるわけじゃなくてaとかa+(型サイズ)のアドレスにいるってことでしょ

386 :デフォルトの名無しさん :2022/11/30(水) 08:48:42.04 ID:HrCmlG76d.net
意味わかめ

387 :デフォルトの名無しさん :2022/11/30(水) 09:16:36.00 ID:b9q4n/fOa.net
つまりstd::vectorはハッシュだった?

388 :デフォルトの名無しさん :2022/11/30(水) 10:27:12.52 ID:7ZJsRDega.net
そんな重要な問題か?これ

389 :デフォルトの名無しさん :2022/11/30(水) 10:30:58.80 ID:3Q6Tcmrep.net
ハッシュが切り刻んでるって意味なら配列の部分だけみたらそりゃあ切り刻んでる罠

390 :デフォルトの名無しさん :2022/11/30(水) 10:39:14.60 ID:PugumI+Zd.net
配列がハッシュだなどとぬかす
糖質っぽいのがいて
後進に有害なので排除中なんだよ

391 :デフォルトの名無しさん :2022/11/30(水) 10:58:53.94 ID:3Q6Tcmrep.net
まあ、別言語の用語を不用意に持ち出すのが良くないんだけどな

392 :デフォルトの名無しさん (アウアウウー Sa5b-zuBb):2022/11/30(水) 11:15:38.95 ID:D6E9fHT2a.net
HAGEYO

393 :デフォルトの名無しさん (アウアウウー Sa5b-zuBb):2022/11/30(水) 11:17:02.00 ID:D6E9fHT2a.net
>>363
コピーってゼロックスですか?って本があったな

394 :デフォルトの名無しさん :2022/11/30(水) 13:33:30.83 ID:M9o3gjq4d.net
>>391
不用意にというより
あいつはPerlスレでうだつが上がらず
こんなところへマウント取りに来た
ヘタレの中のヘタレだろw

395 :デフォルトの名無しさん :2022/11/30(水) 18:59:26.64 ID:YZNvxpbg0.net
PerlでC++にマウントですと!?

396 :デフォルトの名無しさん :2022/11/30(水) 19:13:15.73 ID:ZrFvGDs4d.net
あたおかの論理を分かろうとしても無駄だ
何でC++スレがタゲられたのか俺もわからん

397 :デフォルトの名無しさん :2022/11/30(水) 22:13:23.44 ID:ZNMRPtWe0.net
>>391
ただそれだけのことなのになw

398 :デフォルトの名無しさん :2022/11/30(水) 22:24:11.50 ID:lYG/Gr5c0.net
そこに逃げるしかねえもんな

399 :デフォルトの名無しさん :2022/12/01(木) 05:58:18.98 ID:jAeBwf3w0.net
そりゃPerlでの連想配列の呼び方の話に
> で、配列はハッシュなのか? y/[N]
なんて言ってもない事で絡まれたら逃げるわなw

400 :デフォルトの名無しさん :2022/12/01(木) 06:39:11.77 ID:GVUgh1ntd.net
スレチの話題を持ち込んで散々引張っといて
このヌケサクはなに言ってんだ

401 :デフォルトの名無しさん :2022/12/01(木) 06:52:39.37 ID:jAeBwf3w0.net
そう言うのは糖質でとんちんかんな
> で、配列はハッシュなのか? y/[N]
みたいなこと言うやつに言ってくれよw

402 :デフォルトの名無しさん :2022/12/01(木) 07:10:43.57 ID:K5eb9zSvd.net
嫌われ者

403 :デフォルトの名無しさん :2022/12/01(木) 08:04:02.01 ID:jAeBwf3w0.net
そういうこと言い出すのは反論できない白旗にしか見えないよw

404 :デフォルトの名無しさん :2022/12/01(木) 09:53:27.47 ID:KyNjFts3d.net
配列がハッシュかどうか答えに窮してんのおまえじゃんw
はい/いいえのどちらでもバカにされんの確定してて

405 :デフォルトの名無しさん :2022/12/01(木) 09:55:51.97 ID:KyNjFts3d.net
自分の身の丈より高い評価を貰おうと思うな
バカにされるようなこと言ったんだから
まず当たり前の結果を受け入れろ

406 :デフォルトの名無しさん (ワッチョイ 9f01-YdBL):2022/12/01(木) 10:15:41.20 ID:jAeBwf3w0.net
>>404
> 配列がハッシュかどうか答えに窮してんのおまえじゃんw
配列がハッシュなんて言ってる奴はお前しかいないが?w

407 :デフォルトの名無しさん :2022/12/01(木) 11:33:26.84 ID:K0S28fMrM.net
ハッシュというのは、ある種のデータ構造の一種に名付けられた名前で、
検索を速くするためにハッシュ値を使う方式。
unsigned int hash = CalcHash(key);
でハッシュ値を計算し、
Node *p_hash_table[hash];
でデータのリストに即座にたどり着くような方式。
普通に線形検索する場合と比べて検索が劇的に速くなる。
なので連想配列が必ずハッシュ方式であるとは限らない。
また、配列はコンピュータ科学ではメモリー上でデータを連続的に隣接して配置する
単純なデータ構造に名付けられたものであって、ハッシュ構造(方式)とは区別されている。

408 :デフォルトの名無しさん :2022/12/01(木) 11:39:01.75 ID:K0S28fMrM.net
>>407
訂正:
誤: Node *p_hash_table[hash];
正:
constexpr unsigned int HASH_MAX = 4096;
Node *p_hash_table[HASH_MAX];
・・・
// 典型的なハッシュ方式による検索関数 :
Node *SearchData(string &key) {
 unsigned int hash = CalcHash(key); // とても高速にkeyに対するハッシュ値を計算。
 Node *pNode = p_hash_table[hash]; // 同じhash値に属する全てのNodeのリンクリスト
 while (1) {
  if (pNode->key == key) {
   return pNode;
  }
  pNode = pNode->pNext;
 }
}

テキトーに書いたのでまだ書き間違いが残っているかも知れないが、大体こんな感じ。

409 :デフォルトの名無しさん :2022/12/01(木) 11:42:25.52 ID:K0S28fMrM.net
>>408
[補足]
連想配列に良く使われる方式には、大きく分けて二つ有る:
1. ハッシュ構造 >>408 参照。
2. バランス木(赤黒木、B木(2,3,4木など)、AVL木)

C++では、
1は、map、set、multimap、multiset
2は、unorderd_map、unorderd_set、unorderd_multimap、unorderd_multiset

410 :デフォルトの名無しさん :2022/12/01(木) 11:58:47.42 ID:z3JhSYjVd.net
>>406
俺は言ってない
おまえに聞いてるんだよ
答えらんねーの面白がっておちょくってんのw
もがくほどSっ気を刺激するだけだぜ

411 :デフォルトの名無しさん :2022/12/01(木) 12:01:17.00 ID:DPfpWvvy0.net
>>409
逆じゃね?
map、set~が2で、unorderd~が1じゃないの?

412 :デフォルトの名無しさん (オイコラミネオ MMab-/SwU):2022/12/01(木) 12:15:49.58 ID:cs2lswThM.net
>>411
Yes。
最後は逆だった。つまり正しくは:
1は、unorderd_map、unorderd_set、unorderd_multimap、unorderd_multiset
2は、map、set、multimap、multiset

413 :デフォルトの名無しさん :2022/12/01(木) 13:40:04.60 ID:jAeBwf3w0.net
>>410
言ってないの?
では何のためにいきなりそんなとんちんかんな質問したんだ?w
で、俺はNoと答えるがそれでどうなるんだ?

414 :デフォルトの名無しさん :2022/12/01(木) 13:41:01.80 ID:mifNHULm0.net
>>407
>ハッシュというのは、ある種のデータ構造の一種に名付けられた名前
みなここの部分に賛同できなくて議論になってたんでないの?
あとハッシュ構造ってあなたの造語?

415 :デフォルトの名無しさん :2022/12/01(木) 14:11:29.45 ID:cs2lswThM.net
>>414
MD5などのハッシュとハッシュ法の役割や目的が結構違いまっせ。
前者はデータが改竄されてないかをチェックするために用い、
後者は検索・探索の高速化のために用いる。
恐らく、もとは後者から用いられ始めたのだと思う。知らないけど。

416 :デフォルトの名無しさん :2022/12/01(木) 14:14:27.23 ID:AUjqBN3gp.net
目的が違えどハッシュ関数的には同じ事だよな

417 :デフォルトの名無しさん :2022/12/01(木) 15:09:39.09 ID:9MCw0pWF0.net
>>227が最初だからおまいらもう1週間もやってるんだなw
スレの途中を読む気もしないので論点も把握してないのだが
C++にはstd::hashがあるので用語は厳密に使う必要があるとは思う

418 :デフォルトの名無しさん :2022/12/01(木) 15:12:17.53 ID:vIp4VJD/d.net
>>413=247
さっさと謝ればこんなに恥かかずに済んだのになw

419 :デフォルトの名無しさん :2022/12/01(木) 15:13:34.54 ID:vIp4VJD/d.net
227もおまえだろ

420 :デフォルトの名無しさん :2022/12/01(木) 15:27:34.21 ID:jAeBwf3w0.net
>>418-419
>>227は俺じゃねーしそもそも>>231で当人謝ってるのに今更そんなもんだしてきて恥ずかしくないのか?w
で、連想配列の話はもういいんだな
なら話はもう終わりだろ

421 :デフォルトの名無しさん :2022/12/01(木) 16:24:34.04 ID:aZoVsAyUd.net
そう来ると思ったよ
わかりやすい奴だなw

はいはい、別人なんでちゅねー

422 :デフォルトの名無しさん :2022/12/01(木) 16:53:17.94 ID:jAeBwf3w0.net
>>421
あれれ?
> はい/いいえのどちらでもバカにされんの確定してて
はどうしたんだ?
Noだから はい/いいえ のどちらでも無いってオチかなw

423 :デフォルトの名無しさん :2022/12/01(木) 17:54:20.55 ID:lhJJhxvyd.net
何がハッシュおじをここまで駆り立てるのか。

424 :デフォルトの名無しさん :2022/12/01(木) 18:24:44.11 ID:DTbt9ryPd.net
>>422
バカにして欲しいんなら別人のふりやめろよ
そんな誠実さは持ち合わせてないから
とぼけてるんだろうがな
予想どおりのクズで却って安心してるぜ

425 :デフォルトの名無しさん :2022/12/01(木) 18:51:12.68 ID:paGUeF47p.net
もうハッシュの話はお腹いっぱいだから打ち止めようぜ

426 :デフォルトの名無しさん :2022/12/01(木) 18:59:15.32 ID:LzodZf+Q0.net
はい次

427 :デフォルトの名無しさん :2022/12/01(木) 19:04:03.61 ID:jAeBwf3w0.net
>>424
あらら、話誤魔化すのに必死やねw
もう他人のフリって言い張るしかなくなってて草

428 :デフォルトの名無しさん :2022/12/01(木) 19:12:45.42 ID:mPKw+fm50.net
ハッシュのおかげで今週は皆楽しかっただろ。
ちゃんとお礼言っとけよ。

429 :デフォルトの名無しさん :2022/12/01(木) 19:46:37.26 ID:/Yq43jiI0.net
ハッシュも知らんのか
近頃の若造は

430 :デフォルトの名無しさん :2022/12/01(木) 20:11:16.69 ID:V7pPuh7Ha.net
ハッシュ!ハッシュ!ドラッケン!

431 :デフォルトの名無しさん (ワッチョイ 9701-zuBb):2022/12/01(木) 22:28:42.84 ID:mPKw+fm50.net
ハッシュは配列のことだろ?

432 :デフォルトの名無しさん :2022/12/01(木) 23:01:45.25 ID:zH8jCNhA0.net
ハッシュドビーフのことだろ

433 :デフォルトの名無しさん :2022/12/02(金) 00:20:40.99 ID:h6/3aIZ1M.net
>>416
英語の辞書でhashを引くと、「細切れ」「細かく切る」と出てくる。
これは、検索を高速化するためのHash法のHashテーブルが細かく切って
データを格納していることと対応しているようだ。
つまり、Hashという言葉の由来はこのHash法から来ていると推定できて、
Hash関数や、Hash値という言葉もHash法由来のはず。
だから、MD5などのHash値は、Hash法よりも後発のはず。
つまり、Hashというのは、もともと「Hashデータ構造」に対応していて、
MD5などの値を「Hash値」と呼ぶのは「あとづけ」と考えられる。

434 :デフォルトの名無しさん (オイコラミネオ MMab-/SwU):2022/12/02(金) 00:33:19.34 ID:h6/3aIZ1M.net
>>433
[補足]
何が言いたいかというと、もともとHashという言葉は、Hash法由来で、
Hash値という言葉も、Hash法から来ていて、
Hash値やHash関数が先でHash法が後、ということ「ではない」。
Hash法を実現したいために、Hash値を求める方法が工夫された。
Hash法 ---> Hash 値 (by Hash関数)
が正しい起源。
もう一度言う、Hash値を使っているからHash法なのではない。
Hash法を実現するために作る値がHash値。

435 :デフォルトの名無しさん (ワッチョイ 9f28-9ylf):2022/12/02(金) 00:34:37.55 ID:eNwFIhhK0.net
>>433
別に

436 :デフォルトの名無しさん (ワッチョイ 9f28-9ylf):2022/12/02(金) 00:35:31.14 ID:eNwFIhhK0.net
>>434
いや全く?
全然?

437 :デフォルトの名無しさん (ワッチョイ 9f28-9ylf):2022/12/02(金) 00:45:49.71 ID:eNwFIhhK0.net
>検索を高速化するためのHash法
しかしねえハッシュは本来は実用的なメモリ使用量でメモリに乗りきらないサイズの集合の要素を取り扱うためのしくみなのだから、
入力集合の全単射写像ならハッシュにする意味が無いのだから、
検索を高速化する用途の方が後付けなのだから、

438 :デフォルトの名無しさん (ワッチョイ 9f28-9ylf):2022/12/02(金) 00:48:00.35 ID:eNwFIhhK0.net
ウィキの冒頭にあるようにハッシュというのは検索というよりは区別のためのしくみなのだから、
MDとかSHA-1とかの方こそが本来の意味でのハッシュなのだから、

439 :デフォルトの名無しさん (ワッチョイ 9f28-9ylf):2022/12/02(金) 00:50:17.77 ID:eNwFIhhK0.net
キャッシュメモリもキャッシュメモリに収まりきらないデータをキャッシュメモリに収めるためにハッシュなのだから、

440 :デフォルトの名無しさん (ワッチョイ ffcf-ykd8):2022/12/02(金) 00:50:49.40 ID:VfaFcsHC0.net
Perl のハッシュは、もともとは連想配列 (associative array) という名前で呼ばれていましたが、
この名前は長すぎるので、1995 年頃に、Perl コミュニティの中でハッシュ (hash) と呼ぼうということになりました。
Perl5 の時代からはハッシュと呼ぶことになっています。
ハッシュという名前は、連想配列の「実装」に使われるハッシュテーブル (hash table) に由来しています
以上、あくまでもPerl コミュニティの話で、他のコミュニティで流用したら、こんな風にひと悶着起こすわけです

441 :デフォルトの名無しさん (ワッチョイ 9f28-9ylf):2022/12/02(金) 00:51:31.02 ID:eNwFIhhK0.net
いやしつれいキャッシュメモリのハッシュ利用は検索のためやなサーセン;;;

442 :デフォルトの名無しさん :2022/12/02(金) 01:06:10.28 ID:eNwFIhhK0.net
どういうことかというとxの検索ではxそのものが取り出されねばならないからxのハッシュはxの検索を利用するユーザーからは見えないから脇役
(別段ハッシュを使わない検索手段で実装してもユーザーにはそれはわからない

一方MD5とかSHA-1とからは長いデータが実用的に無視できる確率でしか衝突しない短いハッシュになるというのがウリなので
MD5とかSHA-1を利用するユーザーはMD5とかSHA-1とかのハッシュそのものを目の当たりにするという違いがある、

というしくみ、

443 :デフォルトの名無しさん :2022/12/02(金) 01:47:39.50 ID:h6/3aIZ1M.net
>>437
>検索を高速化する用途の方が後付けなのだから、
Hashが「細かく切る」という意味なのだから、その説は何かおかしい。
細かく切ることによって検索を高速化したものがHash法なのであって。

444 :デフォルトの名無しさん :2022/12/02(金) 02:01:39.85 ID:cil6LVtpa.net
ハッシュ関数の操作にハッシュ感があるんじゃ?

445 :デフォルトの名無しさん :2022/12/02(金) 02:17:32.59 ID:h6/3aIZ1M.net
>>444
Wikipedia英語版のHash tableの項目を見てみると、
The idea of hashing arose independently in different places.
In January 1953, Hans Peter Luhn wrote an internal IBM memorandum
that used hashing with chaining. Open addressing was later proposed
by A. D. Linh building on Luhn's paper.[7]: 15 

となっていて、「hashing」がhash tableの概念をそのまま対応していると
考えられる。hashingのアイデアそのものがhash tableのために生み出されたようだ。

446 :デフォルトの名無しさん :2022/12/02(金) 07:20:08.20 ID:DFt0sUTo0.net
要約すると、ハッシュ法とは配列のことで良いだろ?

447 :デフォルトの名無しさん :2022/12/02(金) 07:32:42.95 ID:7ZxLA8W50.net
インデックスじゃなくてキー式の配列な

448 :デフォルトの名無しさん :2022/12/02(金) 09:21:43.88 ID:7d7w3eSQa.net
>>445
なるほど
勉強になるね

449 :デフォルトの名無しさん :2022/12/02(金) 10:47:13.00 ID:pILexyP1p.net
とある辞書のインデックス

450 :デフォルトの名無しさん :2022/12/02(金) 12:51:51.38 ID:PuSvdAs7M.net
>>446
JSでは、
a[key] = val
でハッシュ法を使ったデータに書き込めるから形式的に配列と同じになっているが、
「アルゴリズムとデータ構造」では、ハッシュ法は配列とは完全に区別されている。

451 :デフォルトの名無しさん :2022/12/02(金) 12:56:29.48 ID:5fL6YCldd.net
C++スレだから用語の定義もC++が前提

452 :デフォルトの名無しさん :2022/12/02(金) 16:13:02.65 ID:ahpGcODy0.net
ハッシュはキー長固定が前提だけど、配列は(概念的には)固定長前提では無いので、この2つを同一視するのは無理がある。

そもそも配列にキー衝突の概念無いだろ。
配列の場合、キーが異なれば衝突しない。

453 :デフォルトの名無しさん (ワッチョイ f79c-YdBL):2022/12/02(金) 16:14:30.69 ID:ahpGcODy0.net
>>452
自己フォロー。固定長は用語がおかしいね。
キーの要約くらいの話か。

454 :デフォルトの名無しさん :2022/12/02(金) 17:48:37.71 ID:u75NJDvrd.net
>>427
いじめて欲しければと言ったろ
別人のふりをするのは構わんが

いいか? 配列はハッシュじゃねえぞ
わかったな?

455 :デフォルトの名無しさん :2022/12/02(金) 18:11:06.69 ID:tKD1RDkG0.net
まあせいぜい逃げ回ってりゃいいんじゃね?w

456 :デフォルトの名無しさん :2022/12/02(金) 18:16:29.52 ID:V13bE4eep.net
まだやってんw

457 :デフォルトの名無しさん :2022/12/02(金) 18:24:41.37 ID:tKD1RDkG0.net
>>456
なぜか
> いいか? 配列はハッシュじゃねえぞ
と言う>>227以外の誰でも知ってることを必死に布教してるらしいw

458 :デフォルトの名無しさん :2022/12/02(金) 18:29:46.96 ID:l1cskCXdM.net
>>452
数学的概念としては、独自に同一視して理論を展開することも可能だが、
そもそも、配列のa[idx]はマシン語の1命令でアクセスできて、1クロックなのに
対して、ハッシュの x[key]は、150クロック〜数千クロック程度かかる。
(少なくとも後者はCPUで1命令(1クロック)では処理できない。)

459 :デフォルトの名無しさん :2022/12/02(金) 18:31:22.54 ID:V13bE4eep.net
>>458
配列の型によるだろ、嘘教えるなよw

460 :デフォルトの名無しさん :2022/12/02(金) 18:45:28.13 ID:tKD1RDkG0.net
そもそもメモリーアクセスが1クロックでできるかどうかは状況によるしハッシュの計算に150クロック以上とかどこから出てきたんだ?

461 :デフォルトの名無しさん :2022/12/02(金) 18:47:05.45 ID:l1cskCXdM.net
>>459
配列の場合、要素のサイズが任意バイトの場合は、一般には明示的な掛け算が必要だから
1クロックではなかった。
スマソ

462 :デフォルトの名無しさん (アウアウウー Sa5b-tFPE):2022/12/02(金) 20:50:07.24 ID:mpDpMcgja.net
シッタカが自爆するスレ

463 :デフォルトの名無しさん :2022/12/02(金) 21:13:31.85 ID:7ZxLA8W50.net
ハッシュはキーがぶつかった時にネストして候補を洗ってく時間がかかるから一意に150クロックってワケでもない

464 :デフォルトの名無しさん :2022/12/02(金) 21:26:41.80 ID:OAAJQcGw0.net
Pythonで経過時刻を測る場合、以下のような方法を使いますが
C++でPythonと同じ計測手法を使うにはどうしたら良いですか?

import time
startTime = time.time()
nowTime = time.time() - startTime
print(nowTime)

465 :デフォルトの名無しさん :2022/12/02(金) 21:29:14.69 ID:jlYcEgfQp.net
OSに依るからなぁ

466 :デフォルトの名無しさん :2022/12/02(金) 21:30:36.64 ID:RyVNohK20.net
なんか面倒くさい<chrono>でがんばる

467 :デフォルトの名無しさん :2022/12/02(金) 21:33:56.38 ID:OAAJQcGw0.net
>>465
Windows限定で使用する予定です。

468 :デフォルトの名無しさん :2022/12/02(金) 21:36:34.16 ID:m95xgUV8M.net
boost::timer::cpu_timerとか?

469 :デフォルトの名無しさん :2022/12/02(金) 21:41:06.49 ID:110d0P8E0.net
>>467
C++ 関係ないけどパフォーマンスカウンターでggrと良いんでは?

470 :デフォルトの名無しさん :2022/12/02(金) 21:45:16.03 ID:FW7hEQSS0.net
std::time とか?

471 :デフォルトの名無しさん :2022/12/02(金) 21:48:04.00 ID:0Xa+fucj0.net
>>460
全然関係ないんだが
鼻で笑えないのか?

472 :デフォルトの名無しさん :2022/12/02(金) 22:24:02.82 ID:eNwFIhhK0.net
OpenMPの一部であるomp_get_wtime()がじつはパフォーマンスカウンタと同じ精度……

ポータブル……

473 :デフォルトの名無しさん :2022/12/03(土) 00:29:43.64 ID:dPKr1JJoM.net
>>460
keyが10文字の文字列の場合だと大体そんなくらい行くであろうと予想したが、
もうちょっと速い場合もあるかも知れない。

474 :デフォルトの名無しさん :2022/12/03(土) 01:21:25.79 ID:dPKr1JJoM.net
>>463
要は、JSなどで配列とHash法が同じ書き方が出来るが故に、Hash法が
「配列」みたいには高速ではないということを知らない人が居るのではないかと
思って書いただけ。
x86系の場合、配列は、要素サイズが1,2,4,8の時はa[i]がマシン語の1命令で
1クロック、それ以外の一般サイズだと2命令で、今のCPUだと、
4クロック〜20クロック程度。
ハッシュ法だと、keyが10文字の文字列の場合で、最低でも、まあ、100クロック位
はかかると見ておいたほうがいい。最高だと上限は無いが、まあ、数千〜数万
クロック程度になると考えた方がいい。
これは、マシン語まで見たときの常識的な間隔。

475 :デフォルトの名無しさん :2022/12/03(土) 02:42:14.20 ID:ngGiofKr0.net
マシン語の1命令で1クロックって、いつの何のCPUだ

476 :デフォルトの名無しさん :2022/12/03(土) 08:52:01.00 ID:+FzzA9JIM.net
0 以上 64 以下の整数 n に対して 2^n-1 (ビットごとの排他的 OR 演算子ではなく累乗の意味 2**n-1 です)を std::uint64_t 型で返す関数って場合分け無しでスッキリ書けませんかね?

477 :はちみつ餃子 :2022/12/03(土) 09:18:16.49 ID:riW5om/o0.net
>>476
こうかな?
std::uint64_t(-1) >> (64-n)

478 :デフォルトの名無しさん :2022/12/03(土) 09:23:14.36 ID:qMCuKdke0.net
std::uint64_tの加算オーバーフロー時の挙動がunsigned intと同様にwrap aroundなんなら普通に
std::uint64_t foo(const int n) { return ((std::int64_t)1 << n) - (std::int64_t)1; }
で良くねconstexpr的な何かとかでマズい?

479 :はちみつ餃子 :2022/12/03(土) 09:26:37.99 ID:riW5om/o0.net
すまぬ。 >>477 だと n が 0 のときは未定義なのでそれだけ場合分けが必要になってしまうな。
だからといって (std::uint64_t(1) << n) - 1 だと 64 のときが駄目だし、
場合分け無しという条件だと思ったよりめんどいかも?

480 :デフォルトの名無しさん (ワッチョイ 8a28-BV3Z):2022/12/03(土) 09:43:52.56 ID:qMCuKdke0.net
違った加算オーバーフローの話やなかったorz

シフト演算については
If E1 has an unsigned
type, the value of the result is E1 × 2E2, reduced modulo one more than the maximum value representable
in the result type.
E1 が符号なし型を持つ場合、結果の値は、E1 * 2E2 の、結果の型で表現可能な最大値より 1 大きい値を法とする剰余となる
なので言語規格上は (uint64_t)1 << 64は合法なはず……

481 :デフォルトの名無しさん (ワッチョイ 8a28-BV3Z):2022/12/03(土) 09:49:24.58 ID:qMCuKdke0.net
訂正orz
誤: 2E2
正: 2**E2 (2のE2乗)

符号付きの型はオーバーフローで例外を発生するアーキテクチャーがあるから
表現できるビット数からあふれるコーディングは未定義動作か何かやが
符号無し型はモジュロ演算になるから溢れてもおk
と言う印象(記憶モード
※ 個人の感想です

482 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv):2022/12/03(土) 10:04:27.89 ID:riW5om/o0.net
>>478
> https://timsong-cpp.github.io/cppwp/n3337/expr.shift
> The behavior is undefined if the right operand is negative, or greater than
> or equal to the length in bits of the promoted left operand.

シフト演算子では右オペランドが (昇格済みの) 左オペランドの幅以上の値だったときは未定義。

483 :はちみつ餃子 :2022/12/03(土) 10:15:30.26 ID:riW5om/o0.net
std::bitset を経由すれば大丈夫だということを発見した。

std::uint64_t((compl std::bitset<64>(0)>>(64-n)).to_ullong())

これを「スッキリ」といえるかどうかは微妙なところかもしれぬ……。

484 :デフォルトの名無しさん :2022/12/03(土) 11:26:23.20 ID:qMCuKdke0.net
>>482
わかりた
ではこう汁、
 指数 n == (n/2) + (n/2) + (n & 1) ※ 除算は結果の小数以下切り捨て
ので
 2**n - 1 = 2**((n/2) + (n/2) + (n & 1)) - 1
 = 2**(n/2) * 2**(n/2) * 2**(n&1) - 1
よって
 std::uint64_t foo(const int n) {
  const std::int64_t x = (std::uint64_t)1 << (n / 2);
  return (x * x * ((std::uint64_t)1 << (n & 1)) - (std::int64_t)1;
 }
でだいたいおk、

485 :デフォルトの名無しさん :2022/12/03(土) 11:32:11.79 ID:D7LggL4j0.net
n?1ull<<(n-1):0

486 :デフォルトの名無しさん :2022/12/03(土) 11:45:55.06 ID:Xj+KmoE3d.net
(1llu << (n>>1) << ((n+1)>>1)) - 1

487 :デフォルトの名無しさん (スップ Sd02-HF5l):2022/12/03(土) 11:53:09.20 ID:Xj+KmoE3d.net
constexpr uint64_t TABLE[65] = {
0x0000000000000000,
0x0000000000000001,
0x0000000000000003,
...
0xffffffffffffffff
};

return TABLE[n];

488 :デフォルトの名無しさん (スップ Sd02-HF5l):2022/12/03(土) 11:57:41.15 ID:Xj+KmoE3d.net
x86-64の場合
shl reg, clのclは下位6bitしか見ないから
1ull<<nが正しく動いた場合マシン語レベルでは分岐してることになる

489 :デフォルトの名無しさん :2022/12/03(土) 21:09:42.26 ID:WYd/d9iJ0.net
>>457
今さら知らなかったとは言えなくて
元々知ってた別人になるしかないもんな

それほどまでに恥ずかしいことだからw

# さあ、おまえが別人かどうかの判断は衆目に任せよう

490 :デフォルトの名無しさん :2022/12/03(土) 23:32:15.77 ID:qMCuKdke0.net
(ID:Xj+KmoE3d が天才すぎてつらいので埋め)

491 :デフォルトの名無しさん :2022/12/03(土) 23:46:07.24 ID:mCv82Mp+M.net
ところで、C++でも、Javab磴#でも、メモャ梶[不足例外を封竭ォしない風潮bノなっている
ようです。それは、メモリー不足が起きる可能性があるところの、
文字列合成やコンテナ要素追加が簡単に書けるようになった反面、
その全ての箇所でエラー処理をするのはめんどくさすぎるという
事情から来ていると思います。
しかし、テキスとエディタなどで、一文字や一行追加した時にメモリーが確保できない
場合に、「メモリーが一杯です」などと表示することはMS-DOSならよくあったことで、
そのような場合にメモリー不足例外を補足する事は原理的には可能です。
いまや、そのような場合のメモリー不足はほぼ起き得なくなってますが、エラーを感知
しないで本当に良いと思われますか?
もっと進めれば、メモリー不足例外は、商用アプリでも「完全無視」を決め込んでも良いと
思われますか?

492 :デフォルトの名無しさん :2022/12/03(土) 23:47:44.27 ID:mCv82Mp+M.net
>>491
携帯SIMを使っているので電波にエラーが生じたらしいです:
誤:ところで、C++でも、Javab磴#でも、メモャ梶[不足例外を封竭ォしない風潮bノなっている
正:ところで、C++でも、JavaやC#でも、メモリ不足例外を補足しない風潮になっている

493 :デフォルトの名無しさん :2022/12/04(日) 00:02:09.11 ID:r/mQBEYb0.net
>エラーを感知 しないで本当に良いと思われますか?
良い
どうせメモリ不足になったら有効なことはほとんど何もできない

ただしそのかわり処理の不意の中断から絶対に保護すべきリソースとか絶対動かしたままにしてはいけない処理は
例外安全なクラスで管理して確実にクローズ処理せねばならない

jこれはメモリ不足の状況でも同じで、そういうのはヒープを使わないで書くのが最善やが、
内部でヒープを使うライブラリに依存している等でヒープをどうしても使わざるおえないの場合は
事前malloc()→例外捕捉時に解放、というテクが昔からあっる

494 :デフォルトの名無しさん :2022/12/04(日) 00:02:21.62 ID:BcAMllhiM.net
スタック的な(?)コンテナで、pop_back()メソッドは戻り値が void型で、
つまり、pop したデータを返しませんが、BJ. stroustrup氏によれば、
それもreturn文で要素をコピー(?)する際に、メモリー不足例外が起きる
可能性考慮したとのことです。
どうしてmoveじゃ駄目なのかもし分かりませんでしたが。

495 :デフォルトの名無しさん :2022/12/04(日) 00:04:34.95 ID:BcAMllhiM.net
>>493
>どうせメモリ不足になったら有効なことはほとんど何もできない
MS-DOSの時、テキストエディタなどではメモリー不足になると、
ちゃんとメッセージを出して、なおかつ、その後もメモリーが無い割には
安定動作してました。

496 :デフォルトの名無しさん :2022/12/04(日) 00:11:51.06 ID:S/+N28Tr0.net
>>489
まだ粘着してるのかよ...
本人だと思いたいんならそれでいいんじゃね?
おれが本人かどうかに関わらずお前が>>231で本人が謝ってるのにしつこく>>227に粘着するクズであることは確定したし
まあもうそうするしかないんだろうけどw

497 :デフォルトの名無しさん :2022/12/04(日) 00:17:03.45 ID:r/mQBEYb0.net
>>494
x = queue.pop();
というのを許すキューの仕様だと
とキュー上のx'とそのコピーxが同時に存在するタイミングが一瞬生じてメモリ不足になりかねないという>>494の懸念の他に、
コピコンが呼ばれる時間の無駄がある

xにムーブコンストラが定義してありqueue.pop()をムーブ対応に設計したとしても
ムーブコンストラクタが呼ばれる時間の無駄は相変わらず存在する

最も効率が良いのはpop()するタイミングまでキュー上のオブジェクトの参照を返し、
pop()するタイミングではキュー上のオブジェクトの破棄のみ行うという現行のインターフェース、

498 :デフォルトの名無しさん :2022/12/04(日) 00:20:25.80 ID:r/mQBEYb0.net
>>495
おま環、

499 :デフォルトの名無しさん :2022/12/04(日) 00:31:29.29 ID:BcAMllhiM.net
>>497
>x = queue.pop();
>というのを許すキューの仕様だと
>とキュー上のx'とそのコピーxが同時に存在するタイミングが一瞬生じてメモリ不足になりかねないという
よく分かりません。できればもっと詳しくお願いできませんか。
キュー上の x' を x に move すれば駄目なのでしょうか?

>xにムーブコンストラが定義してありqueue.pop()をムーブ対応に設計したとしても
>ムーブコンストラクタが呼ばれる時間の無駄は相変わらず存在する
>最も効率が良いのはpop()するタイミングまでキュー上のオブジェクトの参照を返し、
>pop()するタイミングではキュー上のオブジェクトの破棄のみ行うという現行のインターフェース、

なるほど、参照で返すのは効率がよいのは分かりますが、stroustrup氏によれば、moveは
速いと主張されているわけです。
私はmoveより参照の方が効率が良いと常々思っておりましたが。
彼はmoveが大好きなはずなのですが。

500 :デフォルトの名無しさん :2022/12/04(日) 00:37:44.43 ID:r/mQBEYb0.net
>>499
>キュー上の x' を x に move すれば駄目なのでしょうか?
ムーブコンストラが呼ばれる時間の無駄がある(2回目

501 :デフォルトの名無しさん :2022/12/04(日) 00:41:37.02 ID:BcAMllhiM.net
>>500
>ムーブコンストラが呼ばれる時間の無駄がある(2回目
なるほど、ならば、スタックポインタだけ元に戻して、値は捨ててしまう
バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。

502 :デフォルトの名無しさん :2022/12/04(日) 00:43:51.82 ID:BcAMllhiM.net
>>501
Strousstrup氏によると、メモリー不足になって例外が生じた場合の
対処が難しい、みたいなことを言っていたと思います。
しかし、moveコンストラクタ/代入を使った場合にはメモリー不足も生じませんし、
moveコンストラクタ/代入は例外を生じさせてはいけない、と彼自身は
普段から何度も言及していたと思うんです。

503 :デフォルトの名無しさん :2022/12/04(日) 00:49:09.96 ID:BcAMllhiM.net
>>502
仮にstackの要素クラスにコピーコンストラクタしかない場合は、メモリー不足が
生じてstd::bad_alloc 例外がthrowされる場合があるとは思いますが、難しい
とは言ってもそれが生じた場合に対処が全く出来ないとは思えません。
あるとすれば、要素がmoveコンストラクタを持っている場合でも、
try catch ブロックを書くことで、オーバーヘッドが生じる
場合があることを彼は恐れていたのでしょうか。

504 :デフォルトの名無しさん :2022/12/04(日) 01:11:37.29 ID:r/mQBEYb0.net
>>501
ムーブしたかったらqueue.front()が返す参照でキュー上のx'をxか何かにムーブするだけ(※1)で良くね↑?
 x = std::move(queue.front());
 queue.pop_front();

※1: xやx'のクラスにムーブコンストラの定義は必要

>スタックポインタだけ元に戻して、値は捨ててしまう
>バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
ムーブするpop_front()と、デストラクタを呼ぶだけの今のpop_front()がどこが同じなのかkwsk、

505 :デフォルトの名無しさん :2022/12/04(日) 01:20:22.79 ID:qWdYVkpM0.net
標準例外安全規則と強い保証がどうのこうの

506 :デフォルトの名無しさん :2022/12/04(日) 01:33:30.77 ID:BcAMllhiM.net
>>504
マシン語の「pop命令」は伝統的に、スタックポインタを戻すことと、値を読み出すことを
同時に行っていました。
C++の設計では、値の読み出しと、スタックポインタを戻すことが分かれており、命名も
変なのです。
つまり、2つの事を合体させて行なうのが伝統的に「pop」であった伝統や習慣とは
異なる命名をC++はとってしまっているので、心理的に受け入れがたくなっているわけです。

507 :デフォルトの名無しさん :2022/12/04(日) 01:50:30.99 ID:BcAMllhiM.net
>>506
例えば、Rustのpopは、ちゃんとマシン語の伝統と同じく、
戻り値が読み出された値になっていて、かつ、スタックポインタも戻ります。
C++のはどうしてこうなったのか、と思うように伝統を破ってます。
伝統を知らない人が作ったかのように。

508 :デフォルトの名無しさん :2022/12/04(日) 02:00:59.03 ID:6yRfEQxP0.net
削除と値返却を同時にやるpop()が例外安全的に糞だって話はExceptionalC++に1章割いて載ってたはず
今手元にないけど

509 :デフォルトの名無しさん :2022/12/04(日) 02:03:07.32 ID:qWdYVkpM0.net
C++だけでなく、いくつかの言語で、配列にアクセスするのに
push() pop() といった名前の関数があるから、その流れじゃないの
対象はあくまでも配列であって、cpu のスタックとは色々異なるわけだし
そこでどこまでスタックぽく扱うかは、言語の仕様というか設計者のお好みによるというかw

510 :デフォルトの名無しさん :2022/12/04(日) 02:10:09.58 ID:BcAMllhiM.net
>>508
その辺の話をここに書いていただけると幸いです。

511 :デフォルトの名無しさん :2022/12/04(日) 02:22:20.52 ID:BcAMllhiM.net
>>510
自己レスですが、
https://stackoverflow.com/questions/25035691/why-doesnt-stdqueuepop-return-value
これですかね。
[Q] Why doesn't std::queue::pop return value.?
[A]
・・・
So, whats the difference, pop function could have done the same thing.

It could indeed have done the same thing. The reason it didn't, is because a pop that returned the popped element is unsafe in the presence of exceptions (having to return by value and thus creating a copy).

Consider this scenario (with a naive/made up pop implementation, to ilustrate my point):

template<class T>
class queue {
T* elements;
std::size_t top_position;
// stuff here
T pop()
{
auto x = elements[top_position];
// TODO: call destructor for elements[top_position] here
--top_position; // alter queue state here
return x; // calls T(const T&) which may throw
}
If the copy constructor of T throws on return, you have already altered the state of the queue (top_position in my naive implementation) and the element is removed from the queue (and not returned). For all intents and purposes (no matter how you catch the exception in client code) the element at the top of the queue is lost.

This implementation is also inefficient in the case when you do not need the popped value (i.e. it creates a copy of the element that nobody will use).

This can be implemented safely and efficiently, with two separate operations (void pop and const T& front()).

512 :デフォルトの名無しさん :2022/12/04(日) 10:36:33.77 ID:9l16UriTd.net
MMミネヲからはperlerの臭いがする

513 :デフォルトの名無しさん :2022/12/04(日) 11:36:02.70 ID:flilPTWf0.net
0〜255しか格納されないことが保証されている変数aがあって
その変数の値を以下のイメージのように判定する効率的なやり方はないでしょうか
a == {8, 9, 12}
aが{ }内のいずれかの値に該当しているかどうかを判定したいです
{ }はあらかじめ定数でもよいです

514 :デフォルトの名無しさん :2022/12/04(日) 11:40:31.47 ID:RAGda7mP0.net
set<int> unko { 8, 9, 12};
if(unko.find(a) != unko.end()) goto hell;

515 :デフォルトの名無しさん :2022/12/04(日) 11:44:07.96 ID:AOlAqVGT0.net
ルックアップテーブル

516 :デフォルトの名無しさん :2022/12/04(日) 11:54:47.89 ID:flilPTWf0.net
>>514
>>515
ありがとうございます
アドバイスから、bool型の配列を用意しておいてaを添え字にすればよいと思いました

517 :デフォルトの名無しさん :2022/12/04(日) 12:07:00.75 ID:JyCGAu5J0.net
std::bitset<256>はどうですか?

518 :デフォルトの名無しさん :2022/12/04(日) 16:18:10.81 ID:RV2/jwt7M.net
>>513
BYTE qqq[256] = {};
void init() {
 qqq[8]=1;
 qqq[9]=1;
 qqq[12]=1;
}

inline BOOL IsInQqq(int a)
{
 return qqq[a];
}

519 :デフォルトの名無しさん :2022/12/04(日) 16:45:55.42 ID:RAGda7mP0.net
inline bool is_8_9_12(uint8_t a)
{
return 0b0001'0011'0000'0000 & 1 << a;
}

520 :513 :2022/12/04(日) 17:30:39.25 ID:flilPTWf0.net
いろいろ例をありがとうございます
pascalからの移行で集合型をどうにか再現できないかと試している中での質問でした
pascalの集合型なら[8, 9, 12](8, 9, 12は一例で、本来は任意の値を指定したい)を
直接使えて便利なので多用していました

アドバイスのおかげで比較は近いことを再現できましたが、
それとは別のケースで[8, 9, 12]を直接関数の引数で指定する方法を探しています
引数で指定する際の値の範囲は0〜31を超えることはなさそうなので
ビットを立てた整数を返す、可変長引数を取る関数を作れば良さそうだと思いました

521 :デフォルトの名無しさん :2022/12/04(日) 17:37:18.99 ID:S/+N28Tr0.net
>>520
> 集合型をどうにか再現
それが>>517じゃねーの?

> ビットを立てた整数を返す、可変長引数を取る関数を作れば良さそうだと思いました
そういう関数を作れば良さそうだと思います

522 :513 (ワッチョイ 3602-WJTY):2022/12/04(日) 17:49:59.78 ID:flilPTWf0.net
std::bitset<256>も試してみましたが
{8, 9, 12} こういった形式単独で使えるやり方はないかと調べていました

523 :はちみつ餃子 :2022/12/04(日) 18:04:56.88 ID:YO7rrhiC0.net
std::bitset は unsigned long long を受け取るコンストラクタには constexpr が付いてるので
それより小さいビット数の bitset についてならコンパイル時に計算してしまうことも出来る。

524 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv):2022/12/04(日) 18:39:41.91 ID:YO7rrhiC0.net
たぶんやりたいのはこういう感じかな。 (想定は C++17 以上)

#include <bitset>
#include <cassert>
#include <climits>
#include <cstddef>
#include <type_traits>

template <std::size_t N = sizeof(unsigned long long int) * CHAR_BIT, class... T>
constexpr std::enable_if_t<(sizeof...(T) <= N), std::bitset<N>>
make_flagged_bitset(T... args) noexcept {
return std::bitset<N>(((1ULL << args) | ...));
}

// 使用例
int main(void) {
constexpr auto table = make_flagged_bitset(8, 9, 12);
// セットしてないところは偽値
assert(table[0] == false);
assert(table[1] == false);
assert(table[10] == false);
assert(table[20] == false);
// セットしているところは真値
assert(table[8] == true);
assert(table[9] == true);
assert(table[12] == true);
}

525 :513 :2022/12/04(日) 19:19:16.77 ID:flilPTWf0.net
>>524
やりたいことのイメージにすごく近いです
思いもつかない難しい構文で勉強になります
内容を理解して使わせていただきます
ありがとうございました

526 :デフォルトの名無しさん :2022/12/04(日) 19:57:57.00 ID:/CRfCGQ0a.net
定数でいいならマクロでやるとか
#include <cstdio>
#define _(i) (1 << i)
int main() {
int b = _(8) | _(9) | _(12);
for (int i = 0; i <= 12; i++) {
printf("%d:%d\n", i, (b >> i) & 1);
}
return 0;
}

527 :はちみつ餃子 :2022/12/04(日) 20:05:21.16 ID:YO7rrhiC0.net
>>525
念のために繰り返すけど >>524>>523 で述べた性質があるので 64 までしか保証されないし、
エラーチェックをあまり頑張ってないので使い方を間違えたときに捕捉されないかもしれない。
あくまでもおおざっぱにはこういう考えかたでいけるだろうというサンプルだからそのつもりで。

528 :デフォルトの名無しさん :2022/12/04(日) 20:59:12.00 ID:/CRfCGQ0a.net
訂正
#define _(i) (1 << i)
より
#define _(i) (1 << (i))
のほうが安心

529 :513 :2022/12/04(日) 23:12:00.77 ID:flilPTWf0.net
これまでビット演算を意識したことがなかったので考え方を知れて助かります
提示いただいた例から自分でも調査が進められそうでなんとかなりそうです
いろいろありがとうございました

530 :デフォルトの名無しさん :2022/12/05(月) 01:35:26.13 ID:gMitSG4kM.net
>>529
ビット演算より、速度は、>>518が一番速いかも。

531 :デフォルトの名無しさん :2022/12/05(月) 10:23:03.76 ID:DqBKeem4M.net
一々メモリアクセスが発生して直感的には遅そうだけど

532 :デフォルトの名無しさん :2022/12/05(月) 10:35:35.88 ID:hYIKK9DOp.net
オプティマイズされるからなぁ
記述だけで速度なんか分からないよ

533 :デフォルトの名無しさん :2022/12/05(月) 11:26:10.51 ID:9YGPhFSH0.net
多分>>526が一番速いと思う
b と i がレジスタに乗れば最近のプロセッサーならシフトは1クロックだし
>>524は最適化が上手く行けば同じ位になりそう

534 :デフォルトの名無しさん :2022/12/05(月) 12:04:38.42 ID:AHxKL62Z0.net
俺なら3クロックでイッちゃうけどね

535 :デフォルトの名無しさん :2022/12/05(月) 13:51:14.89 ID:0xhTnbB50.net
速度重視なら>>518だろ
メモリ食うけど、つーてもキロバイト未満だし
古いワンチップマイコンとかじゃなきゃ微々たるもん
ハードできる人ならワイヤードロジックって手もある

536 :デフォルトの名無しさん :2022/12/05(月) 13:53:40.80 ID:iLlZW1brp.net
速度重視ならアセンブラ…

いや、何でも無い

537 :デフォルトの名無しさん :2022/12/05(月) 14:04:07.58 ID:0Re98eJO0.net
(Cだけど)昔は isalpha や is~ 系のやつはテーブル参照で実装してたのがあった

538 :はちみつ餃子 :2022/12/05(月) 14:25:03.89 ID:6Xcp09rU0.net
集合を扱うには std::set を使うのが楽だと思う。
集合を集合っぽく扱える機能は一通りそろってるからたぶん集合型というものに期待していることはだいたい含まれるよ。
Pascal の集合型のことはよう知らんけど。

(一般的に) std::set は二分木で実装されるという都合上、やりたいことによっては性能 (速度) 上の不満が生じることもあるかもしれないけど、
具体的な問題が出る前に先回りして考えてもだいたい徒労だしな。

>>537
実行時にロケールを切り替える必要性からじゃない?

539 :デフォルトの名無しさん :2022/12/05(月) 14:43:13.12 ID:9YGPhFSH0.net
>>537
今でもそうじゃないの?
>>520 > 引数で指定する際の値の範囲は0~31を超えることはなさそうなので
と言う条件だからビット演算の方が早いかもって話であって 、-1~255の範囲ならたいていの環境でテーブル引くのが最速だと思う

540 :デフォルトの名無しさん :2022/12/05(月) 14:45:20.89 ID:oclBynCfd.net
>>535
テーブル参照はキャッシュが絡むから
単純ではない

541 :513 :2022/12/05(月) 15:16:20.05 ID:jV16hsjJ0.net
0〜255を格納する方は定数でしか使わないので>>518のやり方にしました
0〜31くらいまでしか使わない方は、変数に格納された任意の値の集合を
そのまま引数に渡したり、積集合や差集合を求めるのを想定しています

確かにstd::setがその用途ですね
速度が遅そうで敬遠していましたが、実際にはこれがボトルネックになることはないと思います
initializer_listと合わせれば、ほぼPascalと同じ使用感でいけるので、ビット演算のテクニックは
引き続き研究しつつ、いったんstd::setで実装しようと思います

542 :デフォルトの名無しさん :2022/12/05(月) 15:31:21.47 ID:0xhTnbB50.net
>>540
constexprも絡むね

543 :530 (オイコラミネオ MM71-NwO+):2022/12/05(月) 17:26:36.58 ID:rfCFGpMmM.net
>>540
キャッシュの話になると本当の速さがなかなか分からなくなってくる。
(CPUアーキテクチャやその他の処理の仕方に依存してしまうし。)
キャッシュがある CPU において、キャッシュミスが発生した場合は、
>>526の方が速いであろうと予測はされる。

そもそも、キャッシュの働きが弱いラズパイPICO、Arduino、ESP32 などでは
恐らく>>518 の方が速い。
そもそもシフト演算がシフト量に比例して遅くなるマイコンもあるだろうし。
Z80や8086はそうだった。

x86、x64の場合、
この関数を使うループの中で、他の目的のためにメモリーを大規模に使った場合は、
>>526の方が速いが、沢山メモリーを使わなかった場合は、>>518の方が速い。

544 :513 (ワッチョイ 3602-g9pY):2022/12/05(月) 17:29:22.78 ID:jV16hsjJ0.net
std::setは集合演算が思った使い勝手ではなかったです
>>526と列挙型を組み合わせることにしました
長々とスレを消費し申し訳ありませんでした
どのレスも参考になり助かりました

545 :はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv):2022/12/05(月) 18:42:52.30 ID:6Xcp09rU0.net
>>544
イテレータを受け渡すのがめんどいな。
そのへんは適当なラッパー関数 (または演算子オーバーロード) を定義すればいいんでないの。
たぶんこんな感じにしたいのかな?
https://wandbox.org/permlink/kpYoEhyGaykqITEG

546 :デフォルトの名無しさん (ワッチョイ 915f-7kHv):2022/12/05(月) 18:43:23.85 ID:k8gztHb50.net
>>544
> std::setは集合演算が思った使い勝手ではなかったです
詳しく。

547 :デフォルトの名無しさん :2022/12/05(月) 18:56:45.80 ID:k8gztHb50.net
>>545 なるほどめんどくさいな。
よく考えたら contains すら C++20 からっていうのもひどい話よな。

548 :デフォルトの名無しさん :2022/12/05(月) 20:18:26.80 ID:Rd1Rhxq6a.net
江添が女性支援に批判的で笑ったわ

549 :513 :2022/12/05(月) 20:57:35.77 ID:jV16hsjJ0.net
>>545
ありがとうございます
いろいろ知識や考えが足りませんでした
おかげ様で理想形に近づけることができました

std::set<T> operator*(const std::set<T>& x, std::initializer_list<T> init)
foo * _(1, 3, 5)
https://wandbox.org/permlink/14GBm1DqQ6iUaRPq

550 :デフォルトの名無しさん :2022/12/06(火) 09:26:29.57 ID:S4cyJC5Ur.net
>>548
ツイフェミに批判的なだけだったわ

551 :デフォルトの名無しさん :2022/12/06(火) 09:51:28.64 ID:mFLMdD4Ga.net
まあ、「ザ・男」ってタイプだからな
ケチがディテールにこだわるのもありがち

552 :デフォルトの名無しさん :2022/12/06(火) 11:12:56.86 ID:63yxghiR0.net
今や絶滅危惧種となったテキトーこくの嫌いな人

553 :デフォルトの名無しさん :2022/12/06(火) 13:12:15.09 ID:9i6eYS/u0.net
そういう人ここは比較的多いでしょ?

554 :デフォルトの名無しさん :2022/12/06(火) 13:47:59.27 ID:63yxghiR0.net
配列がハッシュだなんて裏も取らずに信じちまうやつもか?

555 :デフォルトの名無しさん :2022/12/06(火) 14:38:33.85 ID:mFLMdD4Ga.net
テーブルのアクセスに使う添字はインデックス?キー?

556 :デフォルトの名無しさん :2022/12/06(火) 14:47:42.28 ID:iX2JPZR5d.net
サブスクリプト

557 :デフォルトの名無しさん :2022/12/06(火) 15:21:19.75 ID:RihiShBFa.net
>>554
まだいたのかよ、よほど悔しかったんだなw

558 :デフォルトの名無しさん :2022/12/06(火) 15:50:10.05 ID:iX2JPZR5d.net
信じてたやつが返事してるな
今度こそ別人ではあるまい

559 :デフォルトの名無しさん :2022/12/06(火) 15:56:04.19 ID:iX2JPZR5d.net
HDDを指さしてメモリと言ってたやつのほうがまだマシ
記憶装置という点でそんなに大外れではないからな

配列を指さしてハッシュと言うやつは
アメリカザリガニを指さして飛行機と言うようなもんで
どうやっても擁護不可能

560 :デフォルトの名無しさん :2022/12/06(火) 16:49:16.67 ID:RihiShBFa.net
>>496 にレスできないクズ乙w

561 :デフォルトの名無しさん :2022/12/06(火) 17:07:58.34 ID:uWr4N4pQd.net
美味しいという共通点くらいしか

562 :デフォルトの名無しさん :2022/12/06(火) 18:13:06.65 ID:63yxghiR0.net
ここは技術板
配列とハッシュを混同すること以上の恥もクズも存在し得ない

563 :デフォルトの名無しさん :2022/12/06(火) 18:23:59.19 ID:qiG38keca.net
本人謝ってるのにしつこく絡むのは技術云々の前に人としてどうなの?

564 :デフォルトの名無しさん :2022/12/06(火) 18:57:26.14 ID:6Wvozz0/0.net
だれも謝罪してないし、配列もメモリマネージャーからみればハッシュだし

565 :デフォルトの名無しさん (アウアウウー Sab5-QZbE):2022/12/06(火) 19:27:21.71 ID:qiG38keca.net
>>564
> ただ今勉強中で頓珍漢なこと言ってしまった、すいません
クズにはこれが謝罪に見えないんだな...

566 :デフォルトの名無しさん :2022/12/06(火) 19:41:58.07 ID:6Wvozz0/0.net
EASTLは、unordered_mapに相当するクラスを独自実装しhash_mapと呼んできた経緯がある
Perlの専門用語が他言語に持ち込まれた分りやすい例といえるだろう

567 :デフォルトの名無しさん :2022/12/06(火) 21:47:51.22 ID:63yxghiR0.net
>>565
何? 謝罪したらこんなに恥をかかずに済んだってとこに、まだすがりたいの?
そりゃそうだろうね、技術板で最大の恥をさらしたんだからwww

おまえ悪態つきすぎたんだよ、こっちも悪意に満ちた対応するからな
もう覚悟するしかねえんだよ、おまえw

568 :デフォルトの名無しさん :2022/12/06(火) 21:59:01.18 ID:Pw6mR/Vsp.net
粘着恥ずかしいw

569 :デフォルトの名無しさん :2022/12/06(火) 22:07:01.02 ID:iea0dAEs0.net
C++使いは、その程度のことで粘着しない。
なぜなら、C++使いは爺だから。

570 :デフォルトの名無しさん :2022/12/06(火) 22:59:17.33 ID:wE68yyZV0.net
>>519
あんま細かいこと拘るとハゲるからな

571 :デフォルトの名無しさん :2022/12/06(火) 23:00:17.17 ID:wE68yyZV0.net
レス誤爆メンゴ

572 :デフォルトの名無しさん :2022/12/06(火) 23:03:05.74 ID:id7qJpRpr.net
爺こそ粘着するのでは?
暇だから

573 :デフォルトの名無しさん :2022/12/06(火) 23:07:03.02 ID:iea0dAEs0.net
インテリ爺は粘着される方だろ。

574 :デフォルトの名無しさん :2022/12/07(水) 06:03:51.56 ID:BYUaD+1v0.net
unordered_mapはハッシュを使うというだけで、それ自体がハッシュだという主張は誤り
好意的に解釈してもデータメンバと継承を混同するようなもの

575 :デフォルトの名無しさん (スッップ Sd94-bEFD):2022/12/07(水) 07:45:49.40 ID:mMrpdU8md.net
>>571
メンゴって…

576 :デフォルトの名無しさん :2022/12/07(水) 11:52:13.93 ID:adYZ5td8d.net
まだハッシュ言ってるのか
Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ

577 :デフォルトの名無しさん :2022/12/07(水) 11:59:24.24 ID:O14sy2T20.net
経緯を詳細に見る気もしないんだが話は展開していないし
執着の仕方が常軌を逸していると思う
初出は11/24(>>227)だよ! 2週間

578 :デフォルトの名無しさん :2022/12/07(水) 13:47:36.67 ID:e45EJ0mMd.net
粘着自体は無視スルーすれば良いからどうでもいいわ
それより将来鯖ログ開示されたとき
誰と誰が自演だったかの答え合わせはしてみたい

579 :デフォルトの名無しさん :2022/12/07(水) 14:06:40.54 ID:BYUaD+1v0.net
>>576
このスレでじゃねえよ
配列とハッシュは本質が異なるものだ

>>319 >>383で根本的な説明している

580 :デフォルトの名無しさん :2022/12/07(水) 14:09:36.34 ID:O14sy2T20.net
病的だな

581 :デフォルトの名無しさん :2022/12/07(水) 14:42:14.43 ID:FsTyICUTa.net
誰も興味ないわ

582 :デフォルトの名無しさん :2022/12/07(水) 15:26:40.34 ID:Xzjw4n/la.net
>>576
> Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
それを言ってるならまだ分からないでもないけど 配列 ≠ ハッシュ なんて本人謝ってるのにしつこく絡み続けてる
そんなことでしかマウント取れないんだろうけどマジでなんかの病気だと思うわ

583 :デフォルトの名無しさん :2022/12/07(水) 15:34:18.88 ID:4LPWB+Rga.net
ハゲの上塗り

584 :デフォルトの名無しさん :2022/12/07(水) 15:34:20.23 ID:HdWAA0Dip.net
いいから相手にしない
もう飽きたよ

585 :デフォルトの名無しさん :2022/12/07(水) 15:42:19.49 ID:adYZ5td8d.net
>>579
じゃあParlスレでは適切だったねでもいいよ
皆お前さんの言ってることぐらい分かってる

586 :デフォルトの名無しさん :2022/12/07(水) 17:13:38.78 ID:BYUaD+1v0.net
謝るのに>>313のような態度で許されるとでも思っているのか

587 :デフォルトの名無しさん :2022/12/07(水) 19:28:34.64 ID:cizNPWpb0.net
まーだやってるw

588 :デフォルトの名無しさん :2022/12/07(水) 20:15:26.67 ID:X5O9NNHYF.net
病気だよ

589 :デフォルトの名無しさん :2022/12/07(水) 20:48:27.45 ID:0xPH+d9p0.net
そもそも >>313 は Perl での呼び方の話で 配列 ≠ ハッシュ の話じゃないから謝罪なんてしてない
わざとなのか混乱してるのか知らんけど病的なのは間違いない

590 :デフォルトの名無しさん :2022/12/08(木) 08:19:28.46 ID:/GcWMRnI0.net
>>576
そこにPerl界隈でも使ってないとか言う奴が現れて無駄に反論を呼んだ。

591 :デフォルトの名無しさん :2022/12/08(木) 08:34:20.66 ID:d3Fi/Jhx0.net
今日はParl Harbor攻撃から81年目に当たるらしい

592 :デフォルトの名無しさん :2022/12/08(木) 10:11:41.48 ID:JnPWza2ja.net
>>590
とりあえずそれはなんとか収まったけどその後 配列 ≠ ハッシュ 君が粘着しだした

593 :デフォルトの名無しさん :2022/12/08(木) 10:26:23.30 ID:7N/fyoNc0.net
煽り耐性なさすぎなハッシュ君
ちょっとカマかけると元気にお返事しやがんのw

終わりにしたいなら反応しなきゃいいのに
わざわざ出てくるマゾ野郎w

594 :デフォルトの名無しさん :2022/12/08(木) 12:19:06.63 ID:qJNUqX4GM.net
ハッシュの話をするやつはコテハン付けろ。NGするから。

コテハン無しでハッシュを話題にするのは禁止な。

595 :デフォルトの名無しさん :2022/12/08(木) 12:45:20.88 ID:JnPWza2ja.net
カマなんてかけてもないのに頓珍漢レスしてるキチに言われてもねw

596 :デフォルトの名無しさん :2022/12/08(木) 13:41:50.14 ID:7N/fyoNc0.net
反応してる時点でおまえ悔しさがにじみ出てるからw
こっちは誰が何と言おうと絶対に揺るがない基礎理論に基づいているから安心してアホにできてオモロイだけ

597 :デフォルトの名無しさん (ワッチョイ 30ad-4FAg):2022/12/08(木) 14:56:30.96 ID:d3Fi/Jhx0.net
「C++」が「Java」を抜いて3位に--12月のTIOBEプログラミング言語ランキング - ZDNet Japan
https://japan.zdnet.com/article/35197053/
Liam Tung (Special to ZDNet.com) 翻訳校正: 編集部 2022-12-07 11:32

598 :デフォルトの名無しさん (ワッチョイ 721f-a1Dg):2022/12/08(木) 15:02:28.31 ID:/H4Yp5E/0.net
今更流行る理由があるのか
AI?

599 :デフォルトの名無しさん :2022/12/08(木) 16:44:45.46 ID:iuNweycO0.net
多次元配列クラスのSTL入りもまだなのにAIwwwwwwwwwwwww

600 :デフォルトの名無しさん :2022/12/08(木) 16:45:49.30 ID:MKGRO6qH0.net
>C++の人気が高まる一方で、Javaの人気は低下している

601 :デフォルトの名無しさん :2022/12/08(木) 18:04:41.79 ID:F9H67G14p.net
今更メモリー管理したくないよぉ

602 :デフォルトの名無しさん :2022/12/08(木) 18:10:36.30 ID:z+sTXcJV0.net
>>600
Objective-C(29位から19位に)
みたいな不思議ランキングなんだから、あんまり意味無いんじゃない?

603 :はちみつ餃子 :2022/12/08(木) 18:26:03.92 ID:FVxzWUbn0.net
>>601
したくないけどする必要があるときには C++ くらいの機構があるとやりやすいんじゃろ。 知らんけど。

604 :デフォルトの名無しさん :2022/12/08(木) 18:33:45.11 ID:lUjyKwZV0.net
デストラクタが無い言語とか論外じゃね?

605 :デフォルトの名無しさん :2022/12/08(木) 19:14:03.24 ID:ZTTdli19a.net
基礎理論w

606 :デフォルトの名無しさん :2022/12/08(木) 19:42:03.83 ID:pXyaJjcm0.net
欧米の知的な人たちの間でC++が流行ってるんだろ。

607 :デフォルトの名無しさん :2022/12/08(木) 19:43:41.79 ID:pfHF/B3ga.net
したくないというポイントはだいたい稼げるところだな

608 :デフォルトの名無しさん :2022/12/08(木) 20:48:03.13 ID:+R/2mzDC0.net
インテリ
ジェンス

609 :デフォルトの名無しさん :2022/12/10(土) 04:54:52.93 ID:NVs+qJ8Ua.net
まぁゲーム開発はいつまでもC++だからなぁ。ついでC#

610 :デフォルトの名無しさん :2022/12/10(土) 12:17:36.89 ID:c/3U+eWJ0.net
UIはその時の流行りの言語で書くけど戦術ロジックだけは絶対にC++で書きたい

611 :デフォルトの名無しさん :2022/12/10(土) 12:26:15.44 ID:z6yEzr6lp.net
C#って、むしろ大規模になって来ると意味不明なエラーが出て破綻しないか?

612 :デフォルトの名無しさん :2022/12/10(土) 14:59:01.80 ID:mMjCV03FM.net
C#が悪いわけではないけど、メモリー解放とかルーズにしたままある程度コード書けちゃうからね、、、
大規模になってくると無頓着だったメモリー解放が火を吹く感じはある

C++はそんなルーズな書き方してたらすぐ破綻するから、そういうコードは多くないけど初期の実装には多くの時間がかかる感じ

613 :デフォルトの名無しさん :2022/12/10(土) 15:38:10.95 ID:Sts37KEXa.net
c#のプロジェクトはなんか疎結合になっとらんこと多いわ

614 :はちみつ餃子 :2022/12/10(土) 17:52:23.34 ID:brInbnm70.net
プロジェクトを分割しようとしてもどうにも分離しきれない絡み合った部分ってあると思うんよ。
そういうときは機能別に分割するというだけではなく絡み合った部分は絡み合ったものとしてレイヤとして切り分けると上手くいく。
面倒くさいところは一か所に押し込めて横に切る感じ。

C# のプロジェクトはレイヤで分ける意識が希薄で縦割りばかりするので分離しきれない結合が全体にうっすらと残ってる感じ。
密結合というほどではないけど全体にうっすらなので、面倒くさい箇所が一か所にまとまってるよりしんどい。

というのが私の印象。 C# のことはあんまり知らんけど。

615 :デフォルトの名無しさん :2022/12/10(土) 18:06:38.22 ID:7p0k8251M.net
https://ideone.com/gopFXn
なんか100回転してから落とすコード書いたはずがヘンな事になってる。
間違ってたかな?向こうのバグかな??

616 :デフォルトの名無しさん :2022/12/10(土) 20:25:28.70 ID:PM5iwksI0.net
DのUpdateみると1000ms待たないと終わらないように見えるけどそれはいいの?

617 :ハノン :2022/12/10(土) 20:33:03.87 ID:6SBPs3AFH.net
>>614
トップダウン、ボトムアップ、両面から書いていったとき、それが出会うところでグダグダなその場しのぎのコードに書かざるを得ない経験はありますね

618 :デフォルトの名無しさん :2022/12/10(土) 20:33:20.22 ID:MWcOm8HwM.net
#include <iostream>

int main() {
const int i = 1;
++*const_cast<int*>(&i);
std::cout << i;
}

何が表示されると思う?
違法?合法?

https://wandbox.org/permlink/57h9V6JX7fJes663

619 :デフォルトの名無しさん :2022/12/10(土) 20:55:46.09 ID:G20+9FPP0.net
>>618
const なオブジェクトに書き込むのは許されない (未定義) が型の上で const を外すだけならアリ。 つまり ++ を除けば合法だが ++ のせいで違法。

620 :デフォルトの名無しさん :2022/12/10(土) 21:19:19.36 ID:+Ttg8yU5a.net
int main() {
const int i = 1;
int*j =const_cast<int*>(&i);
*j=2;
std::cout << &i<<" "<< j<<std::endl;
std::cout<<i <<" "<< *j;
}

https://wandbox.org/permlink/DC1E3ycea3UtdBAI

0x7ffc53e76e1c 0x7ffc53e76e1c
1 2

上のやつちょっといじってみた
アドレスの値同じなのに値違うんだけどなんでなんだろ

621 :デフォルトの名無しさん :2022/12/10(土) 21:23:07.71 ID:QKVQj6nE0.net
そりゃ未定義動作だもの
鼻から悪魔が出なかっただけありがたいと思え

622 :デフォルトの名無しさん :2022/12/10(土) 21:57:24.92 ID:lr6mtoK80.net
その処理系ではconst_castはコンパイラをごまかす宣言ではなく&iというオブジェクトを作ってるんだろう

623 :デフォルトの名無しさん :2022/12/10(土) 22:07:20.11 ID:qktiUlCS0.net
コンパイル時にiが1に置き換えられてるだけだろう

624 :デフォルトの名無しさん :2022/12/10(土) 22:23:55.76 ID:lr6mtoK80.net
それだけじゃ&iの動作について言及が足りない感じ

625 :デフォルトの名無しさん :2022/12/10(土) 22:36:19.38 ID:HtRCvZl/0.net
多分
 const int i = 1;
を受けた最適化の結果、
 std::cout<<i

 std::cout<<1
という意味のコードになったとかじゃないの
逆アセして調べると良い

626 :デフォルトの名無しさん :2022/12/10(土) 22:38:11.75 ID:HtRCvZl/0.net
あるいは真にiの値を見たいのなら
 ...(前半は同じ)...
 auto *p = (volatile int*)&i;
 cout << i << " " << j << endl;
みたいにするとか?
※ 個人の感想です

627 :デフォルトの名無しさん :2022/12/10(土) 22:38:50.72 ID:HtRCvZl/0.net
まつがえたorz
あるいは真にiの値を見たいのなら
 ...(前半は同じ)...
 auto *p = (volatile int*)&i;
 cout << *p << " " << j << endl;
みたいにするとか?
※ 個人の感想です

628 :デフォルトの名無しさん (ワッチョイ 477c-eoXr):2022/12/10(土) 23:00:40.51 ID:QKVQj6nE0.net
未定義動作をどうしようとコンパイラの自由なんだからそんなもの調べたってしょうがない
ちゃんと書けばいいだけのこと

629 :デフォルトの名無しさん (ワッチョイ 8710-bPD3):2022/12/10(土) 23:01:50.82 ID:lr6mtoK80.net
既に
std::cout << &i<<" "<< j<<std::endl;
により&iとjが同じ値であることは示されてる

auto *p = (volatile int*)&i;
これでも同じアドレスとして解釈されている(試した)

きっとconst_castに限らずconst領域のアドレスを解釈する時点で
ここのコンパイラは別領域を確保するんだな

630 :デフォルトの名無しさん (ワッチョイ 477c-eoXr):2022/12/10(土) 23:07:18.20 ID:QKVQj6nE0.net
そのcoutに出してるコードも含めて未定義動作なんだから出力されるゴミ文字列には何の保証も意味もないぞ
だからちゃんとやれ

631 :デフォルトの名無しさん (ワッチョイ df28-GD9R):2022/12/10(土) 23:07:19.81 ID:HtRCvZl/0.net
>>629
↓の間違いなのでは……
std::cout << &i<<" "<< &j<<std::endl
これが同じ値になるのなら、iとjが別の実体という仮説はむしろ棄却され、
鼻から悪魔が出たか、さもなくば>>625の説明ぐらいしか残らない

632 :デフォルトの名無しさん (ワッチョイ 8710-bPD3):2022/12/10(土) 23:34:26.52 ID:lr6mtoK80.net
>>631
jの型はアドレスint*やで

iと&iが別実体と解釈されてないとこの処理系の挙動は説明できないよ

633 :デフォルトの名無しさん :2022/12/11(日) 00:20:42.40 ID:Pzj62nR+0.net
>>632
左様かスマンカッタorz

今神のお告げがあったが多分
>iと&iが別実体と解釈されてないとこの処理系の挙動は説明できないよ
というのは
>変数iとcout << の引数としての定数1が別実体と解釈されてないとこの処理系の挙動は説明できないよ
と考えたら>>625と同じ……

634 :デフォルトの名無しさん :2022/12/11(日) 00:25:27.26 ID:Wb0o85TW0.net
>>633
iが最適化後定数だろうとconst変数だろうと&iについての説明が必要だし
>>625を否定してるわけじゃないよ
>>625のうえで&iがどう処理系で実装されているのかという話

635 :デフォルトの名無しさん :2022/12/11(日) 00:29:21.03 ID:Wb0o85TW0.net
あーごめん>>634は取り消し

636 :デフォルトの名無しさん :2022/12/11(日) 16:42:27.87 ID:le6rXKgRM.net
未定義動作ではいおしまいは思考停止では?
コンパイラの実装を考えてみるのも面白い

637 :デフォルトの名無しさん :2022/12/11(日) 17:18:36.24 ID:SgVyrwp80.net
ゴミ捨て場の汚物の配置を面白がる趣味もいいけどそれで宇宙の真理を読み取ったとか言い出されても困るんだわ

638 :デフォルトの名無しさん :2022/12/11(日) 17:28:44.13 ID:B9k8N7vL0.net
特定のコンパイラの挙動が知りたいなら逆アセしろ
仕様が知りたいなら未定義動作

と言うだけの事だろ

639 :デフォルトの名無しさん :2022/12/11(日) 19:27:20.67 ID:vt5XMNwC0.net
未定義踏んで、たまたま望む動作だった場合に、それを放置するのは危険すぎる

640 :はちみつ餃子 :2022/12/11(日) 19:44:01.28 ID:ftKoc+Hh0.net
前後の状況との組み合わせでも結果が変わったりするから短いコードで試しても
そのコンパイラでの挙動を知れたとは言えんし……。

641 :デフォルトの名無しさん :2022/12/12(月) 02:44:59.90 ID:m98xyCFn0.net
挙動を考えるというか思想とか背景を考えるのが面白いんだよ
組み込みじゃconst領域は物理的に変えられない場合があるからって
余計な事考えちゃったけどたしかに>>625だろうなって

642 :デフォルトの名無しさん :2022/12/12(月) 14:55:49.27 ID:P0mM9QsZM.net
vector<string> v; の vを辞書順でソートした場合、string自体はメモリ上に
連続して並ぶが、肝心の文字列バッファは free store 上でバラバラに離れた
位置になるからキャッシュ・ミスし易くなるね。
stroustrup氏はリンクリストがキャッシュミスし易いと言って馬鹿にしていたが、
実際には動的配列(vector)でも大差は無い。
なお、リンクリストでキャッシュミスし易い典型例がソート後の全巡回ループ。
そしてその場合、vectorでもstringのようなメモリ資源ハンドルの場合は
キャッシュミスが免れない。

643 :デフォルトの名無しさん :2022/12/12(月) 15:09:17.26 ID:P0mM9QsZM.net
>>642
[補足]
そもそも、C++はcopyの代わりのmoveによる高速化を自慢しているが、
それが意味を持つのはstringのようにfree storeのメモリをポインタで持っている
ようなクラスである。
このご自慢のmoveが良く効くクラスTのvector<T>をソートした場合、
free storeの本当の中味のアドレスはソートされないまま。
なので、vectorを全巡回する時には、アドレスが飛びとびになり、キャッシュミス
が起き易い。

644 :デフォルトの名無しさん :2022/12/12(月) 15:14:58.58 ID:b4gQwKir0.net
>>642 うんうん。リンクリストにするとキャッスミスし易さがもう少し悪化するね。

645 :デフォルトの名無しさん :2022/12/12(月) 15:21:22.44 ID:P0mM9QsZM.net
>>644
この例の場合、vectorをlistに変えてもあまり悪化しない。
なぜなら、stringとその文字列バッファが近接したアドレスのfree store
上にallocateされていると期待できるから。

646 :デフォルトの名無しさん :2022/12/12(月) 15:26:03.32 ID:P0mM9QsZM.net
>>645
[補足]
list<string> v2; の場合、push_back すると、
p1 = new string;
相当の事が実行されるが、p1 の内部の文字列バッファも、string のコンストラクタ
の中で
p2 = new char[N];
のようにして free store から確保される。
確率的には、p1 と p2 は非常に隣接したアドレスになっている可能性が非常に
高い。
その結果として、p1をアクセスした直後にp2にアクセスしてもキャッシュミスは起きない。
その結果、vector<string>とlist<string>のソート後の全巡回でのキャッシュミス回数は、
ほぼ同じ。

647 :デフォルトの名無しさん :2022/12/12(月) 15:33:08.04 ID:b4gQwKir0.net
>>645 そうだね。悪化するのは少しだけだね。
おや? >>642 ではバラバラに離れてキャッシュミスしやすいと言っていた文字列バッファが
リンクリストの話になると近接するのかい?不思議だねぇ。

648 :デフォルトの名無しさん :2022/12/12(月) 15:34:37.69 ID:s9w5HO4Md.net
典型的な用途ではsmall-string optimizationで大部分が連続になるでしょ
リンクリストにその恩恵はない

649 :デフォルトの名無しさん :2022/12/12(月) 15:37:07.44 ID:P0mM9QsZM.net
>>647
>おや? >>642 ではバラバラに離れてキャッシュミスしやすいと言っていた文字列バッファが
>リンクリストの話になると近接するのかい?不思議だねぇ。
ソートしたときには、stringと対応する文字列バッファは意味論的には
くっついている。だから、「対応している」両者は隣接しているんだ。

650 :デフォルトの名無しさん :2022/12/12(月) 15:39:41.84 ID:P0mM9QsZM.net
>>649
[補足]
vector<string>をソートすると、stringの「箱」が新しく確保されてしまうので、
中身だけがmoveされるので、stringと対応する文字列バッファは「離れ離れになる」
list<string>をソートすると、stringはアドレスは全く変化せず、string同士の
リンクのされ方だけが変化するだけだから、stringと対応する文字列バッファは、
メモリー空間上でのアドレスの隣接を維持する。

651 :デフォルトの名無しさん :2022/12/12(月) 15:40:54.03 ID:P0mM9QsZM.net
>>648
それはstringだけの話。
今回はstringを例にとって話しただけで、一般のTではそんな現象は起きない。

652 :デフォルトの名無しさん :2022/12/12(月) 15:49:40.91 ID:P0mM9QsZM.net
>>650
[補足]
vector<string>のソート後の様子:
アドレス
0x0000: st100 ---> buf100 (st100とbuf100のアドレスは離れ離れ)
0x0010: st5 ---> buf5 (st5とbuf5のアドレスは離れ離れ)
st100とst5は隣接する。
ソート時に中身のアドレスだけがmove。

list<string>のソート後の様子:
st100 ---> buf100 (st100とbuf100は隣接したまま)
st5 ---> buf5 (st5とbuf5は隣接したまま)
st100とst5は隣接しない(但し、元のアドレスを維持したまま)。
ソート時には、一切のmoveもcopyも全く発生せず。

653 :デフォルトの名無しさん :2022/12/12(月) 22:25:35.59 ID:1Of7Vyge0.net
いちいちキャッシュのことまで考えて書いたことなんかないですねえ

654 :デフォルトの名無しさん :2022/12/12(月) 22:29:51.34 ID:EC98/b6s0.net
天才ですから

655 :デフォルトの名無しさん (ワッチョイ 8710-bPD3):2022/12/12(月) 22:53:10.09 ID:m98xyCFn0.net
ソート済みならソートの利点を生かしたデータアクセスが主だろうからなあ
まあ最悪値を考えるかアベレージを考えるかはプログラム次第か

656 :デフォルトの名無しさん (ワッチョイ df28-GD9R):2022/12/12(月) 23:33:02.97 ID:OmhP4qQH0.net
キャッシュミスが起きるとか
キャッシュに収まりきらない要素数のリンクリストを
全要素まんべんなくアクセスし続ける場合とかの話であって
そうなれば区々たるデータ構造などあんま意味を成さなさげ

657 :デフォルトの名無しさん :2022/12/13(火) 06:29:45.20 ID:RVT68Vp10.net
>>656
だからお前のコードは遅いんだな

658 :デフォルトの名無しさん :2022/12/13(火) 07:27:28.93 ID:XemHbbXi0.net
配列とハッシュの話を蒸し返すけど、キャッシュに退避したデータを取り出す仕組みはハッシュなので、配列も無意識・無自覚のハッシュといえる

659 :デフォルトの名無しさん :2022/12/13(火) 07:49:45.53 ID:HbzfEbfW0.net
トホホw

660 :デフォルトの名無しさん :2022/12/13(火) 09:16:15.65 ID:Dz/G0kAxd.net
プログラムのフェッチもハッシュ、ライトもハッシュ、全てはハッシュに収束するのだ

661 :デフォルトの名無しさん :2022/12/13(火) 09:37:04.67 ID:XemHbbXi0.net
ありていにいえば、他のレイヤーのデータを参照する時にハッシュを使わないと処理速度が落ちてしまうので、いたるところに速度対策でハッシュ参照が実装されているってのがFA

662 :デフォルトの名無しさん :2022/12/13(火) 09:54:38.28 ID:6kCyUqZEd.net
仮にunordered_vectorなるものがあったにしても、それはハッシュではない

663 :デフォルトの名無しさん :2022/12/13(火) 10:16:13.34 ID:3/h11tyKd.net
それunordered_setじゃね

664 :デフォルトの名無しさん :2022/12/13(火) 10:32:20.10 ID:nLXwCo+B0.net
vectorはそもそもunorderdだろ
setは同じ値を格納できないのだからvectorとは違う

665 :デフォルトの名無しさん :2022/12/13(火) 11:27:12.09 ID:qMfL3xzXM.net
全文字列を結合したものを一括で確保して string_view を操作するのが1番パフォーマンス良さそう

666 :デフォルトの名無しさん (ワッチョイ dfad-KKgq):2022/12/13(火) 11:41:42.04 ID:XemHbbXi0.net
>>665
失礼な言い方になるかもしれませんが、あなた初心者ですね
“パフォーマンス”を気にする人はそもそもC++なんて使いませんよ

667 :デフォルトの名無しさん (アウアウウー Sa6b-SJNI):2022/12/13(火) 11:47:57.08 ID:QcbajiAMa.net
>>666
そんなに苦手だったんか
まあこれから練習したらええよ

668 :デフォルトの名無しさん (スップ Sd7f-exKU):2022/12/13(火) 12:02:52.82 ID:RxDW3iqvd.net
パフォーマンスを気にする人は何を使うんでしょうか

669 :デフォルトの名無しさん :2022/12/13(火) 12:10:16.41 ID:6kCyUqZEd.net
>>664
意味わからん
気がふれた?

670 :デフォルトの名無しさん :2022/12/13(火) 14:54:36.88 ID:56FF6Qc2a.net
>>669
え?w

671 :デフォルトの名無しさん :2022/12/13(火) 16:20:37.61 ID:6kCyUqZEd.net
>>670
vectorがunorderedとが頭おかしいのかって

672 :デフォルトの名無しさん :2022/12/13(火) 16:36:06.63 ID:RxDW3iqvd.net
えっ???

673 :デフォルトの名無しさん :2022/12/13(火) 16:50:01.90 ID:nLXwCo+B0.net
>>669
c++のunorderd_は挿入時に挿入要素のキーによるソートが行われず要素の格納順が実装依存なコレクションに付けられている名称だから、vectorがunoreded_かどうかと言えばyesじゃない?

674 :デフォルトの名無しさん :2022/12/13(火) 16:51:40.89 ID:Dz/G0kAxd.net
vectorがorder性持ってたら逆に困る

675 :デフォルトの名無しさん :2022/12/13(火) 17:09:14.84 ID:Dz/G0kAxd.net
intkeyのorderedmapってことか

676 :デフォルトの名無しさん :2022/12/13(火) 17:26:33.26 ID:nLXwCo+B0.net
>>675
そういう考え方もあるか
でもiteratorで途中指定してinsertしたらそれ以降のキーと要素の対応全部ずれるしmapと考えるのはどうなんだ

677 :デフォルトの名無しさん :2022/12/13(火) 17:27:23.47 ID:qOIMmk+U0.net
ランダムアクセスできるデータ構造でordered_だのunordered_だの定義してもこじつけでしかないし意味薄いんでは

678 :デフォルトの名無しさん :2022/12/13(火) 18:15:32.74 ID:afkUacc60.net
てす

679 :デフォルトの名無しさん :2022/12/13(火) 18:20:36.37 ID:7X0MJm0+a.net
そんな事を言い出したらページアウトされてるデータの読出しになるかもしれないからディスクアクセスかもしれないだろ

680 :デフォルトの名無しさん :2022/12/13(火) 18:25:37.11 ID:6kCyUqZEd.net
>>673
格納順を定義しろ

681 :デフォルトの名無しさん :2022/12/13(火) 18:29:09.49 ID:6kCyUqZEd.net
ふざけたオレ定義はトコトン馬鹿にしてやんよ

682 :デフォルトの名無しさん :2022/12/13(火) 18:32:26.52 ID:nLXwCo+B0.net
>>680
iterator でたどれる順番

683 :デフォルトの名無しさん :2022/12/13(火) 18:35:45.77 ID:nLXwCo+B0.net
>>680
ところでこの話の発端のhashでないunorderd vector ってどんなものをイメージしてたの?

684 :デフォルトの名無しさん :2022/12/13(火) 18:46:51.67 ID:RVT68Vp10.net
>>681
まずはお前の定義を書け

685 :デフォルトの名無しさん :2022/12/13(火) 18:50:59.76 ID:6kCyUqZEd.net
>>682
今、屋台で酒飲んでるから後でな

686 :デフォルトの名無しさん :2022/12/13(火) 18:55:09.41 ID:c7PbDuSHM.net
>>673
vectorは連続したメモリ領域に要素を保存し、順番に並ぶことを保証する。

そうやってc配列との互換性を保っているのは常識かと思っていたけど、仕様変わったの?

687 :デフォルトの名無しさん :2022/12/13(火) 19:04:10.54 ID:nLXwCo+B0.net
>>686
それで正しいと思うよ
c++のunorderd_/(ordered_)は要素をキーにしてコレクションがソート済みになるかどうかを意味してると考えれば>>673とも矛盾してないでしょ?

688 :デフォルトの名無しさん (ワッチョイ a7f0-exKU):2022/12/13(火) 19:20:14.84 ID:RVT68Vp10.net
ordered_配列 ==> 勝手に中身がソートされる配列
が思い浮かぶ

689 :デフォルトの名無しさん (ブーイモ MM8f-5DNi):2022/12/13(火) 19:23:38.37 ID:LOsLj3+sM.net
>>688
std::multiset なんてのがあるんだな

690 :デフォルトの名無しさん (オイコラミネオ MM7b-VZV0):2022/12/13(火) 19:24:14.15 ID:jWNvO27sM.net
そもそも、ordered かどうかは定義の問題。
まず、mapは、(key,value)を持っていて、keyで検索できる。setは、keyだけでvalueが無いが、
keyで検索できる。setは、mapでvalueをkeyにしたようなもの。だから、以下ではmapだけ
の話をする。
mapやunorderd_mapは、「検索」機能とbegin(),end() を利用した「巡回機能」の
両方を持っていて、巡回を key の大小関係順に巡れるかどうかで、
ordered かどうかが決まる。
バランス木(赤黒木など)を使う方が 接頭辞なしの map、ハッシュ法を使う方が
unorderd_map
前者の場合は、常に自動的に並び替えられた状態で格納される。
一方、そもそも vector は、好きな順序で入れられて決まったキーもなければ
自動的に並び替える機能も持ってないし、orderedかどうかを定義しても
特に意味が無い。そもそも、orderdのvectorが存在し無い。
また、故意に作ってもしょうがない。

691 :デフォルトの名無しさん (ワッチョイ a7f0-exKU):2022/12/13(火) 19:26:29.60 ID:RVT68Vp10.net
ordered, unordered
が書けないヤツが多すぎ問題

692 :デフォルトの名無しさん (ワッチョイ a7f0-exKU):2022/12/13(火) 19:27:00.39 ID:RVT68Vp10.net
実は全部同じ人?

693 :デフォルトの名無しさん (オイコラミネオ MM7b-VZV0):2022/12/13(火) 19:28:42.74 ID:jWNvO27sM.net
>>688
それが大体、「set」や「multiset」に相当する。

694 :デフォルトの名無しさん (ワッチョイ 675f-k8RX):2022/12/13(火) 19:28:56.13 ID:sAeHrnUZ0.net
巡回機能って何

695 :デフォルトの名無しさん (オイコラミネオ MM7b-VZV0):2022/12/13(火) 19:37:41.71 ID:jWNvO27sM.net
>>694
まだ使ったことが無いので書き方が間違ってるかも知れないが、
map<T,V> m;
に対して、
for ( auto &r : m ) {
 cout << r.first << ":" << r.second << "\n";
}
で巡ることができる機能の事を言ったつもり。
for ( auto i = m.begin(); i != m.end(); ++i ) {
 cout << m[i].first << ":" << m[i].second << "\n";
}
と等価だと思う。
ただし、一度も使ったことが無い。

696 :デフォルトの名無しさん :2022/12/13(火) 20:16:44.72 ID:RVT68Vp10.net
>>693
全然処理量のオーダーが違う
0点

697 :デフォルトの名無しさん :2022/12/13(火) 21:45:11.86 ID:FUi24cxt0.net
keyとしてpointerを指定したmapがpointeeで正しくソートできるように
3番目のテンプレート引数にpointerを剥がして比較するless演算子を
以下のように渡します
g++ではm1は-std=c++17では不可ですが-std=c++20だと通ります
m1にはcomparatorの型しか情報を渡しておらず
m1は実装に関しては何も知らないはずなのですが
正しくpointeeでソートします なぜ?

#include <iostream>
#include <memory>
#include <map>
using namespace std;
int main ()
{
using Ptr = shared_ptr <int>;
auto comparator ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
using Map = map <Ptr, int, decltype (comparator)>;
// Map m0 (comparator); // -std=c++17と-std=c++20で可
Map m1; // -std=c++17で不可, -std=c++20で可
m1.insert (make_pair (make_shared <int> (2), 2));
m1.insert (make_pair (make_shared <int> (1), 1));
m1.insert (make_pair (make_shared <int> (3), 3));
for (const Map::value_type &key_value: m1)
cout << key_value.first << ' ' << key_value.second << '\n';
return 0;
}

698 :デフォルトの名無しさん :2022/12/13(火) 22:04:34.09 ID:qOIMmk+U0.net
>>697
C++20でキャプチャ指定のないラムダ式がデフォルトコンストラクタを持つようになったからかな
https://ja.cppreference.com/w/cpp/language/lambda

699 :デフォルトの名無しさん :2022/12/13(火) 22:11:52.14 ID:FUi24cxt0.net
>>698
なるほどー!

700 :デフォルトの名無しさん :2022/12/13(火) 22:27:14.40 ID:FUi24cxt0.net
納得しちゃダメだった
ラムダ式の型は実装ごとに異なるみたいですね
以下__cxa_demangleがg++依存だけども
#include <iostream>
#include <memory>
using namespace std;
namespace abi {
extern "C" {char *__cxa_demangle (const char* __mangled_name, char* __output_buffer, size_t* __length, int* __status);}
}
string name_of (const type_info &p)
{
int status (0);
char *tmp (abi::__cxa_demangle (p.name (), 0, 0, &status));
string result (tmp);
free (tmp);
return result;
}
int main ()
{
using Ptr = shared_ptr <int>;
auto c0 ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
auto c1 ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs > *rhs;});
cout << (typeid (c0) == typeid (c1)) << '\n';
cout << name_of (typeid (c0)) << '\n'
<< name_of (typeid (c1)) << '\n';
return 0;
}
$ g++ -std=c++20 test.cpp
$ ./a.out
0
main::{lambda(std::shared_ptr<int> const&, std::shared_ptr<int> const&)#1}
main::{lambda(std::shared_ptr<int> const&, std::shared_ptr<int> const&)#2}

701 :デフォルトの名無しさん :2022/12/13(火) 23:32:00.27 ID:vjOTFb3s0.net
>>697
> m1にはcomparatorの型しか情報を渡しておらず
> m1は実装に関しては何も知らないはずなのですが
ここが思い込みかと。
ラムダ式のクラス型に比較関数が含まれてて、その内容もインスタンスに依存しないし、
比較方法は十分伝わってるから問題ないということで何も不思議じゃないと思う。

702 :デフォルトの名無しさん :2022/12/13(火) 23:43:34.19 ID:FUi24cxt0.net
>>701
はい
ラムダ式の型というものを理解していませんでした
型で実装を伝えることができるのは
関数ポインタと大きく異なっていて面白い性質ですね

703 :デフォルトの名無しさん :2022/12/13(火) 23:48:00.37 ID:FUi24cxt0.net
関数ポインタと書きましたが
関数オブジェクトとの相似で考えると不思議じゃないですね
関数オブジェクトも型で実装の情報を渡しますから
失礼しました

704 :デフォルトの名無しさん :2022/12/14(水) 08:35:41.62 ID:YVPbaJHSM.net
>>687
c++のunorderd_/(ordered_)は要素をキーにしてコレクションがソート済みになるかどうかを意味してると考えれば

全然違うよ。標準くらい読みなよ。

Associative containersとUnordered associative containerの本質的な違いはキーの定義。
Associative containersのキーは順序で比較可能でなくてはならず、Unordered associative containerは同値で判定可能でなくてはならない。
ついでに言うと、配列は(記憶に間違いなければ)直接メモリ番地で指定できなきゃならなくて、キー(みたいなもの)も(正)整数でなくてはならなかったはず。

705 :デフォルトの名無しさん :2022/12/14(水) 08:45:51.73 ID:MH9vv9Il0.net
配列の添字がキーだと思ってる人と
配列の中身がキーだと思ってる人
とじゃ会話が成り立たない

実際はどちらもキーではない

706 :デフォルトの名無しさん :2022/12/14(水) 09:11:41.03 ID:F4iAWC8Wd.net
ねえパパ、バカって何?
簡単なことを難しく言う人のことだよ
う~ん、よくわかんないや

707 :デフォルトの名無しさん :2022/12/14(水) 09:19:31.03 ID:0zkFeBrgd.net
標準の話をするならvectorは連想配列じゃないしorderとか考えるものでもない

708 :デフォルトの名無しさん :2022/12/14(水) 09:39:28.51 ID:iS/QLVofa.net
vectorで添字アクセスするのはなんか違う

709 :デフォルトの名無しさん :2022/12/14(水) 09:55:06.54 ID:fk0KXlHdM.net
>>同値で判定可能
同値「かどうか」判定可能じゃないの?
>>配列は直接メモリ番地で〜
意味不明

710 :デフォルトの名無しさん (スップ Sd7f-exKU):2022/12/14(水) 10:35:37.85 ID:Y6rgBuPWd.net
定義もせずに真偽を議論しようとするアホ

711 :デフォルトの名無しさん :2022/12/14(水) 11:33:30.37 ID:ZSc/wamY0.net
>>709
>同値「かどうか」判定可能じゃないの?

意味不明。

厳密に言うなら、Unordered associative containerが要求しているのはa == b a != b。
同値「かどうか」とか曖昧な突っ込みで何やりたいの?

712 :デフォルトの名無しさん :2022/12/14(水) 12:05:38.08 ID:apgWSyiy0.net
>>704
なるほどだいたい理解した
つまり最初の話に戻るなら unordered_multivector というものを考えた場合、格納する要素を a == b と a != b が定義されているものに限定して、
最悪の実装を考えると要素の格納方法は vector そのもので良くて要素のサーチは先頭からリニアに a == b をチェックしていくことになり、
unordered_vector ならば要素格納時に a == b なものを除外すればよいというわけだね

713 :デフォルトの名無しさん :2022/12/14(水) 12:13:00.02 ID:Y6rgBuPWd.net
(使い所が無い)新たなコンテナを考えるスレじゃないと思う
当然Perlのスレでもない

714 :デフォルトの名無しさん :2022/12/14(水) 12:23:38.93 ID:Y6rgBuPWd.net
C++の配列がordered, unorderedどちらの分類に近いかなら
キーが配列の添字 ==> ordered
キーが配列の中身 ==> unordered

715 :デフォルトの名無しさん :2022/12/14(水) 12:29:53.77 ID:Y6rgBuPWd.net
>>712
同じ値を除外する必要は無い
集合と違って配列は同じ値を許すのが普通

716 :デフォルトの名無しさん :2022/12/14(水) 12:39:11.82 ID:14xvhmEyM.net
>>712
>>705

中身とキー(みたいなもの。インデックス・添字)は別物。

あと、標準だと
The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other
than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
だから、vector にunorderとかmultiとか考えても意味がない。混乱の元だからやめたほうがいい。

717 :デフォルトの名無しさん :2022/12/14(水) 13:40:10.14 ID:Y6rgBuPWd.net
setはキーも中身も同じ

718 :デフォルトの名無しさん :2022/12/14(水) 13:44:24.99 ID:F4iAWC8Wd.net
ハッシュの配列はハッシュではない

719 :デフォルトの名無しさん :2022/12/14(水) 13:52:25.03 ID:Y6rgBuPWd.net
>>716
vectorのキーはuniqueでordered
vectorの中身はmultiでunordered
考えるまでもなく自明

720 :デフォルトの名無しさん :2022/12/14(水) 14:28:12.41 ID:0zkFeBrgd.net
vectorにinsertがある
添字はkeyではなくindexでしかない
何にとってorderedであるかはプログラマーに委ねられている

721 :デフォルトの名無しさん (スップ Sd7f-exKU):2022/12/14(水) 16:26:53.57 ID:Y6rgBuPWd.net
訂正

vectorの添字はuniqueでordered
vectorの中身はmultiでunordered

722 :デフォルトの名無しさん :2022/12/14(水) 17:18:36.72 ID:qZt9MbKWM.net
>>711
いや「同値で判定可能」って日本語として意味通ってないじゃん
取れる揚げ足を作った奴が悪いよ
「厳密に言うなら〜が要求しているのは a==b a!=b」も全然厳密じゃないじゃん
a, b が何なのかも書いてないし、operator== と operator!= が定義さえされてればいいのか (a==b) ^ (a|=b) が true である必要まであるのかもその書き方だと分からない

723 :デフォルトの名無しさん :2022/12/14(水) 17:36:27.63 ID:Y6rgBuPWd.net
ordered ≠ 全順序
== : 同値関係ではない

724 :デフォルトの名無しさん :2022/12/14(水) 17:42:08.99 ID:Y6rgBuPWd.net
== が同値関係であるとは

a == a
a == b ⇒ b == a
a == b, b == c ⇒ a == c

725 :デフォルトの名無しさん :2022/12/14(水) 17:58:56.90 ID:ekFaWlb/M.net
>>697
>m1は実装に関しては何も知らないはずなのですが
>正しくpointeeでソートします なぜ?
結論から言うと、ラムダ式は 関数呼び出し演算子 operator()() を
持った名前なし functor に対応していて、「デフォルト値」で構築
しても機能を果たすから。

[詳細]

ラムダ式は、名前なし functor で、関数呼び出し演算子 operator()() を持った
クラスに対応している。いまの場合、
auto comparator ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
は、
class SomeFunctor {
public:
 bool operator()(const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;}
};
に対応していて、
SomeFunctor cmp{};
で SomeFunctor のオブジェクトを作ってから、
bool b = cmp(lhs, rhs);
とすると比較できる。
故に map クラスは SomeFunctor のオブジェクトをデフォルト値で
初期化すればいいことになるから、ユーザーが SomeFunctor の初期値
を渡さなくて良い。
実際に、mapクラスは、デフォルト値で初期化した SomeFunctor のオブジェクトを
基本クラスのメンバ変数に(実質的に)持っている。

726 :デフォルトの名無しさん :2022/12/14(水) 18:01:30.49 ID:ekFaWlb/M.net
>>696
setクラスは常に大小順に順序を整列し続ける集合としては最高レベルに高速。
検索も挿入もO(N・log N)

727 :デフォルトの名無しさん :2022/12/14(水) 18:13:49.08 ID:ekFaWlb/M.net
>>704
いや、ordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、
範囲forで巡ると、挿入した順序ではなく、比較関数で比較した結果に基いてソートされた順序になる。


https://stackoverflow.com/questions/7648756/is-the-order-of-iterating-through-stdmap-known-and-guaranteed-by-the-standard

Yes, that's guaranteed. Moreover, *begin() gives you the smallest

C++
・std::map is a sorted associative container

https://stackoverflow.com/questions/11274978/are-c-stdmapstring-string-ordered


are STL maps ordered?

Yes, a std::map<K,V> is ordered based on the key, K, using std::less<K> to compare objects, by default.
So if I iterate over it, it will iterate with the first insert string first?
No. It will iterate based on the sorted order, not the order that you inserted elements. In the case of std::string, it sorts in lexicographic order (alphabetic order).
If you want to iterate based on the insertion order, you're better off using a sequence container, such as a std::vector or a std::list.

728 :デフォルトの名無しさん :2022/12/14(水) 18:15:48.90 ID:ekFaWlb/M.net
>>727
誤: いや、ordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、
正: いや、unordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、

729 :デフォルトの名無しさん :2022/12/14(水) 18:16:04.80 ID:Y6rgBuPWd.net
>>726
つまり>>696

730 :デフォルトの名無しさん :2022/12/14(水) 18:20:54.42 ID:ekFaWlb/M.net
>>702, 703
そういうことやね。
ラムダ式は、関数呼び出し演算子 operator()()を持ったクラスに対応していて、
その演算子が、ラムダ式の中身になっているから、テンプレート引数に
クラスの型を渡すだけで関数を渡せる。
ローカル変数をキャプチャしている場合は、どうなっているか良く知らないけども、

731 :デフォルトの名無しさん :2022/12/14(水) 18:31:09.04 ID:Y6rgBuPWd.net
>>726
なんかさらっとオーダー間違ってるし
見逃した

最高レベルでもない
検索も挿入もO(1)なのが存在する

732 :デフォルトの名無しさん :2022/12/14(水) 18:32:24.38 ID:Y6rgBuPWd.net
>>728
じゃんけん型の場合はどうなるんだろうねえ

733 :デフォルトの名無しさん :2022/12/14(水) 18:34:00.96 ID:ekFaWlb/M.net
>>731
ほんまや。正しくは、一回当りの検索や挿入に掛かる時間のオーダーは、
O(logN)
だと思うわ。

>>731
>検索も挿入もO(1)なのが存在する
常にソートし続ける集合でそんなん有りましたっけ?

734 :デフォルトの名無しさん :2022/12/14(水) 18:36:10.47 ID:ekFaWlb/M.net
>>733
俺は、紙に書いてあるのを丸覚えてるわけじゃなくて、あたまのなかで
1秒でシミュレーションして自分で割り出してるが、簡単すぎるので、
テキトーに書いてしまう癖が有って、打ち間違える。

735 :デフォルトの名無しさん :2022/12/14(水) 18:38:06.37 ID:boxWAqPPd.net
int x,y;
auto f = [&x,y](){};
のとき、

fの型は
struct{
int& _x;
int _y;
void operator()();
};

相当だとは思う。
コンストラクタ周りがどういう扱いされてるかはわからん

736 :デフォルトの名無しさん :2022/12/14(水) 18:39:44.53 ID:14xvhmEyM.net
>>722
c++標準に言えよ。

737 :デフォルトの名無しさん :2022/12/14(水) 18:42:43.51 ID:Y6rgBuPWd.net
>>734
なにその言い訳www

738 :デフォルトの名無しさん :2022/12/14(水) 18:45:03.96 ID:Y6rgBuPWd.net
逆に
構造を知らないでオーダーだけ丸暗記してるようなのがいるとでも思ってる?

739 :デフォルトの名無しさん :2022/12/14(水) 19:02:37.51 ID:Y6rgBuPWd.net
>>733
はい

740 :デフォルトの名無しさん :2022/12/14(水) 19:04:38.48 ID:YVPbaJHSM.net
>>727
key とelementが紛らわしいなぁ。
c++標準は「keyで並び替える」。setはkeyがelementになるので結果として「elementで並び替えたのと一緒」となるだけ。key とelement をしっかり区別しないと擬似問題になるよ。

741 :デフォルトの名無しさん :2022/12/14(水) 19:09:19.21 ID:Y6rgBuPWd.net
>>740
>>721

742 :デフォルトの名無しさん :2022/12/14(水) 19:25:11.39 ID:14xvhmEyM.net
>>741
「中身はmultiでunordered」の意味が全然分からないから無視したんだけど……
なにこれ?

743 :デフォルトの名無しさん :2022/12/14(水) 19:27:27.41 ID:Y6rgBuPWd.net
そのままの意味

744 :デフォルトの名無しさん :2022/12/14(水) 19:29:17.49 ID:Y6rgBuPWd.net
配列の中身は順序が定義されてる必要はなく
複数の値も取り得る

745 :デフォルトの名無しさん :2022/12/14(水) 19:33:54.85 ID:Y6rgBuPWd.net
配列の中身をmultisetのkey,element
配列のインデックスをmultisetの要素のn番目のn
ととらえれば配列はmultiでunordered

配列の中身をelement
配列のインデックスをkey
ととらえれば配列はuniqueでordered

実際はどちらでもない

746 :デフォルトの名無しさん :2022/12/14(水) 19:48:43.68 ID:6VpEeBw/0.net
>>744
「複数の値も取り得る」は嘘だろ。
vector<vector<T>>の話?

747 :デフォルトの名無しさん :2022/12/14(水) 19:57:11.36 ID:MH9vv9Il0.net
a[0] = 0;
a[1] = 0;

748 :デフォルトの名無しさん :2022/12/14(水) 20:03:19.82 ID:MH9vv9Il0.net
multi : 別の場所に同じ値を入れられる、同じ値を複数個保持出来る

749 :デフォルトの名無しさん :2022/12/14(水) 20:44:33.97 ID:QXbvEgmH0.net
声のでかさが正義だと思っている、どっかの山猿軍団みたいなやつがいるな

750 :デフォルトの名無しさん :2022/12/14(水) 21:17:02.90 ID:x1JxbarV0.net
>>725,730
有難うございます
その理解に至りました
それと>>698の合わせ技で
mapのkeyにポインタを入れるのが随分とスマートになった印象です

using Ptr = shared_ptr <int>;
auto comparator ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
using Map = map <Ptr, int, decltype (comparator)>;
Map m1;

751 :デフォルトの名無しさん :2022/12/14(水) 21:22:32.15 ID:XhtdH9iqa.net
>>691-692
知ってた

752 :デフォルトの名無しさん :2022/12/14(水) 21:59:55.78 ID:K5HiKCY5M.net
>>738
ここは、教科書そのままを丸覚えしてるだけの人が多すぎるように感じるので。
教科書に出てなくても、ちゃんと実際に起きるようなことを書くと全く理解できない
人が多すぎるから。

753 :デフォルトの名無しさん :2022/12/14(水) 22:46:07.31 ID:MH9vv9Il0.net
>>752
例えばだれ?

754 :デフォルトの名無しさん :2022/12/14(水) 22:58:57.25 ID:6VpEeBw/0.net
>>747 >>748
multimapの"multi"の意味と違うなぁ。それはmapでもできる話じゃない?
cpprefjpに解説あるから調べたら?

C++ Standards だと22.2.6.4ですな。
(N4849)
An associative container supports unique keys if it may contain at most one element for each key.
Otherwise, it supports equivalent keys.
The set and map classes support unique keys; the multiset and multimap classes support equivalent keys.

755 :デフォルトの名無しさん :2022/12/14(水) 23:00:05.46 ID:K5HiKCY5M.net
>>753
失礼だけど、ここの人、ほぼ全員。

756 :デフォルトの名無しさん :2022/12/14(水) 23:31:04.79 ID:6VpEeBw/0.net
>>755
「ほぼ全員」というのは「自分は除く」ということかね。
傲慢だなぁ。

757 :デフォルトの名無しさん :2022/12/14(水) 23:35:44.65 ID:K5HiKCY5M.net
>>756
なぜそう思うかって言うと、俺が言ったことがちゃんと通じる相手も存在しているからだよ。
客観的にハイレベルだと思える人には俺の言ったことが通じる。
しかも、この話だと確実に通じると思ったことはちゃんと確実に通じる。
ところが、この板だと結果は惨敗。全く通じなくて、逆にけなされ、馬鹿にされる。

758 :デフォルトの名無しさん :2022/12/14(水) 23:37:23.23 ID:3zhhSsQg0.net
よせやい。照れるわ

759 :デフォルトの名無しさん :2022/12/14(水) 23:47:40.49 ID:MH9vv9Il0.net
>>754
同じキーを複数入れられる
という意味

760 :デフォルトの名無しさん :2022/12/14(水) 23:48:26.06 ID:MH9vv9Il0.net
>>757
お前の日本語が悪いだけじゃね?

761 :デフォルトの名無しさん :2022/12/14(水) 23:50:51.18 ID:MH9vv9Il0.net
お前も俺が書いたこと理解してないし
俺からみたらお前はアホ

762 :デフォルトの名無しさん :2022/12/14(水) 23:54:44.29 ID:MH9vv9Il0.net
>>754
>>745を見た上で書いたんだよな?
だとしたらアホだ

763 :デフォルトの名無しさん :2022/12/14(水) 23:58:15.35 ID:K5HiKCY5M.net
>>761
普通に東大生とかなら通じる内容だぞ。
自分で「まともなこと」言ってるかどうか、俺は分かるもの。

764 :デフォルトの名無しさん :2022/12/15(木) 00:02:56.94 ID:YuqRQs180.net
お前東大生?

765 :デフォルトの名無しさん :2022/12/15(木) 00:16:01.78 ID:3Zw/afEhM.net
>>764
身元がばれるから言わん。

766 :デフォルトの名無しさん :2022/12/15(木) 00:22:28.27 ID:YuqRQs180.net
あんまり東大の品位を下げるような発言はやめてね

767 :デフォルトの名無しさん :2022/12/15(木) 00:26:32.79 ID:3Zw/afEhM.net
>>766
なお、東大生でも理解力が無い人は理解力無いと思う。
本当に頭のいいのは、一部の学科に集中している。
東大以外でもレベルの高い大学なら理解できる人多いぞ。
ここにも東大生は来てるかも知れんが、残念ながら頭がいいタイプの人は来てない。

768 :デフォルトの名無しさん :2022/12/15(木) 00:27:32.73 ID:NC87g1Wm0.net
これだけ内容の無い連投も珍しいな

769 :デフォルトの名無しさん :2022/12/15(木) 00:33:45.79 ID:YuqRQs180.net
理解力が無い人は理解力が無い
当たり前ですねwww

770 :デフォルトの名無しさん :2022/12/15(木) 00:42:28.23 ID:YuqRQs180.net
0点の人か
言い訳が見苦しいねえ

771 :デフォルトの名無しさん :2022/12/15(木) 00:48:44.56 ID:3Zw/afEhM.net
ホリエモンや高橋洋一も言っていたが、レベルが合わないと話してることが
全く理解されなくて、むしろ馬鹿にされ、阻害されるものなんだぞ。
高橋洋一にいたっては東大に行っても理解されなかったそうだ。
根本的に頭がいい人はそうなる。
日本では特にそういう人を社会から除外するし。

772 :デフォルトの名無しさん :2022/12/15(木) 00:50:57.77 ID:NC87g1Wm0.net
いや、雑談スレじゃねーし

773 :デフォルトの名無しさん :2022/12/15(木) 00:56:26.15 ID:3Zw/afEhM.net
>>772
このスレでは、目に余るものがあって、
そもそも、学級崩壊しているような状態で、まともに議論できない。
正しいことを言ってる人を馬鹿にして、間違ってる子と言ってる人が大きな
顔をして、自分が正しいことを言っているかのような態度をとる。
そもそも議論の土台が出来て無い。
まずは、ホームルームや道徳の様なことから始めなくては。

774 :デフォルトの名無しさん :2022/12/15(木) 01:09:34.07 ID:5pPRyT0s0.net
コミュニケーションってのはコンパイラと違って
言語モデルやその背後にある思考モデルはダイナミックに変化する
それについていけなければ会話は成立しない
更に特定の一つコンパイラを相手にしていれば良いという訳でもない

775 :デフォルトの名無しさん :2022/12/15(木) 01:16:26.87 ID:3Zw/afEhM.net
>>774
現実に通じる相手も存在する。
居るところには沢山居るが、日本全体としては少数。
だから、コミュニケーションの問題ではなく、生まれつきの頭のよさの問題だと
俺は理解している。

776 :デフォルトの名無しさん :2022/12/15(木) 01:24:05.73 ID:5pPRyT0s0.net
会話ってのは一人でやるもんじゃないんだよ
双方が相手の頭の中を推定できたときに初めて噛み合う
相手に自分の頭の中を推定しやすいような
手掛かりを上手に出すのも技術のうち

777 :デフォルトの名無しさん :2022/12/15(木) 01:27:53.05 ID:3Zw/afEhM.net
>>776
もしかしたら、ネットだと文字が読めてないのかもしれない。
声では理解できるのに長い文書が読めない人が多いらしい。

778 :デフォルトの名無しさん :2022/12/15(木) 01:58:19.99 ID:yiRddat50.net
>>762
>745を見直したけど意味不明だわ。
これは>719
>vectorのキーはuniqueでordered
>vectorの中身はmultiでunordered
>考えるまでもなく自明
の説明ということだよな?

> 配列の中身をmultisetのkey,element
> 配列のインデックスをmultisetの要素のn番目のn
> ととらえれば配列はmultiでunordered
で配列をpair<K,T>[]に限定するような話が突然出てくる。
>712のunordered_vectorに頭の中身が引きずられてない?
そんなにunordered_vectorの話がしたいの? 俺は嫌だよ。

>配列の中身をelement
>配列のインデックスをkey
>ととらえれば配列はuniqueでordered
はかすかに議論の流れに沿っているけど、
>実際はどちらでもない
で放り投げられているから、結論として何を主張したいのかも分からん。
これじゃ「>719はどちらも間違い」という主張にしか見えん。
>745にマトモな結論も主張も無いから、この話がどう>747 >748 につながるかも分からん。

エスパーじゃないんだから、バラバラで繋がりの無い情報を読んでも>762の頭の中なんて分からんよ。
「だとしたらアホだ 」と言う前に、引用レスぐらいちゃんと読み直して補足情報ぐらい書いたら?

779 :デフォルトの名無しさん :2022/12/15(木) 02:20:47.08 ID:yiRddat50.net
>>775
そりゃ、有り難くも相手が理解しようと努力してくれているからだろ。

会話で「情報の非対称性」は意識している?
相手がどのような情報を持っているのかを無視して、自分の立場を
ゴリ押しして相手にマウントしようとすれば、そりゃ相手に嫌われるわ。
まあ、相手に嫌われるのが目的ならそれでOKだけど。

780 :デフォルトの名無しさん :2022/12/15(木) 07:04:36.25 ID:cCqUdoUCd.net
ハッシュでないものをハッシュということにしたくてヤダジタ大暴れ
みっともねえな

781 :デフォルトの名無しさん :2022/12/15(木) 07:12:05.83 ID:hWaEpCH1a.net
>>713>>714 が同じ人間と思えないくらい

>>714 のあほっぷり

782 :デフォルトの名無しさん :2022/12/15(木) 07:27:41.09 ID:dbf8SNdVd.net
でかい声出しても人を小馬鹿にしても
それでハッシュでないものがハッシュになるわけでなし
無駄で関係ない努力をし、そのために他人に迷惑が及んでも
構わないという自己中心的なやつ

783 :デフォルトの名無しさん :2022/12/15(木) 07:31:15.67 ID:hWaEpCH1a.net
>>768
一人二(+a)役でピンポンしてるだけでは

784 :デフォルトの名無しさん :2022/12/15(木) 07:50:47.01 ID:YuqRQs180.net
>>745でわからないアホと会話するのは不可能

785 :デフォルトの名無しさん :2022/12/15(木) 07:52:47.62 ID:0irp5Zs10.net
>>778
あまりにも、あまりにもレベルが低い
まるでチンパンジーのようだ

786 :デフォルトの名無しさん (テテンテンテン MM8f-0RkQ):2022/12/15(木) 12:23:36.75 ID:WaHslr7gM.net
>>784
>>778

>745で説明したことにするアホと会話するのは不可能

787 :デフォルトの名無しさん :2022/12/15(木) 12:47:10.10 ID:WaHslr7gM.net
hashのレスはあんまり読んでいないんだけど、c++標準のhashの話だよね?

c++標準と関係の無いhashをc++スレで持ち出してhash hash 言っているわけじゃないよね?

まさかそんなアホいないよね?

788 :デフォルトの名無しさん :2022/12/15(木) 13:55:56.86 ID:adPtbWG70.net
いまだにハッシュガーとか言ってるのは何が悔しいのか粘着キチだからスルーでOk

789 :デフォルトの名無しさん :2022/12/15(木) 16:19:30.66 ID:dbf8SNdVd.net
>>787
いやC++に限らない一般論としてハッシュとは何が明らかに分かってないやつが暴れてんの

790 :デフォルトの名無しさん :2022/12/15(木) 16:24:26.31 ID:dbf8SNdVd.net
見たところPerlスレ民のほうが
キチガイを追い出すのはうまかったようだな

791 :デフォルトの名無しさん :2022/12/15(木) 19:54:56.58 ID:SaYQ/lLy0.net
Perl民は70代中心だからな。

792 :デフォルトの名無しさん :2022/12/16(金) 00:24:44.89 ID:kaubkXoa0.net
心の欲するところに従えども矩を踰えず、

793 :デフォルトの名無しさん :2022/12/16(金) 08:43:50.12 ID:Sk8Nrr7L0.net
名前、それ自体がハッシュだよ
ありとあらゆるものが名前を与えられることによって唯一性・独自性を確保する
つまり、人間の脳は万物をハッシュで管理している

794 :デフォルトの名無しさん :2022/12/16(金) 08:57:47.68 ID:3/NVi56ad.net
ほらな
何にもわかっちゃいねえ
乱数や暗号との違いが言えねえぞコイツ

795 :デフォルトの名無しさん :2022/12/16(金) 09:10:39.36 ID:wsa7u1K/d.net
C++の話しようぜ

796 :デフォルトの名無しさん :2022/12/16(金) 10:09:11.46 ID:zTEnSqew0.net
c++20のコンセプトとかモジュールとか<=>とか誰か使ってる?

797 :デフォルトの名無しさん :2022/12/16(金) 10:24:14.76 ID:8MYQQby5d.net
<=> 使ってる

798 :デフォルトの名無しさん :2022/12/16(金) 11:19:29.52 ID:rgyul2GY0.net
>>796,797
へー 初めて知った

799 :デフォルトの名無しさん :2022/12/16(金) 12:00:08.46 ID:8wSlC2cWa.net
ウホッ演算子

800 :デフォルトの名無しさん :2022/12/16(金) 12:09:30.80 ID:3/NVi56ad.net
<=>は便利だね
使い出すとやめられん

801 :デフォルトの名無しさん :2022/12/16(金) 12:26:19.15 ID:YwJTJAAR0.net
<=>初めて知ったけどめちゃ便利だな
うちの環境じゃ使えないのが残念だけど

802 :デフォルトの名無しさん :2022/12/16(金) 15:18:01.45 ID:h3Zax2und.net
operator==のdefaultは便利だわ

803 :デフォルトの名無しさん :2022/12/17(土) 02:36:30.45 ID:ufrS8am+a.net
a > b, a < b, a == b を一度に判定するだけの演算子の何がそんな便利やねん!
とおもったらこれ一つ定義するだけで各種比較演算子全部児童生成してくれるのね
なるほどこりゃ便利かも

804 :デフォルトの名無しさん :2022/12/17(土) 05:21:21.32 ID:dncno9m70.net
unorderedの比較の実装は相変わらず迷う

805 :デフォルトの名無しさん :2022/12/17(土) 08:51:24.48 ID:SViislQC0.net
ロリコンショタ歓喜じゃん

806 :デフォルトの名無しさん :2022/12/17(土) 09:11:20.17 ID:rODQUlPF0.net
using rel_ops だとスコープ全体に影響でるから使用控えてたけど、operator<=>で全部解決出来るようになったのはいいな

807 :デフォルトの名無しさん :2022/12/17(土) 09:32:05.93 ID:XBBLmCjVd.net
3方があると4方も欲しくなる

a < b
a = b
a > b
unordered

結局戻り値4値の関数を作ることになる

808 :デフォルトの名無しさん :2022/12/17(土) 11:46:18.72 ID:QZoKK6jA0.net
宇宙船演算子……!
ってオーバーロード……!
可能なの……?!

809 :デフォルトの名無しさん :2022/12/17(土) 12:25:08.76 ID:dQNfWhWG0.net
>>807
std::partial_ordering返すようにすれば<=>で4方出来るぞ

810 :デフォルトの名無しさん :2022/12/17(土) 12:44:09.97 ID:rODQUlPF0.net
>>808
いや、なにをいってるんだ
そのためのものだろ

811 :デフォルトの名無しさん :2022/12/17(土) 14:06:58.32 ID:t4TbQFP40.net
ストリーム入出力に使っていけ(※冗談です)

812 :デフォルトの名無しさん :2022/12/17(土) 14:23:32.76 ID:QZoKK6jA0.net
>>810
それはそうか……orz
a-bのオーバーフロー対策なだけかと一瞬思った……

813 :デフォルトの名無しさん :2022/12/20(火) 07:42:37.51 ID:louNKIVjd.net
NaN同士の比較とかあるからな

814 :デフォルトの名無しさん :2022/12/20(火) 14:22:24.61 ID:UPRI61by0.net
このスレ見てるとわかるがC++が好きって言ってるやつって知能低いな

815 :デフォルトの名無しさん :2022/12/20(火) 15:05:44.24 ID:0942ga5D0.net
このスレには周囲に天才と言われる人がいるからそれは違うな

816 :デフォルトの名無しさん :2022/12/20(火) 15:17:57.65 ID:/qMRbodsp.net
自称だけどな

817 :デフォルトの名無しさん :2022/12/20(火) 15:21:56.61 ID:louNKIVjd.net
あんなやつに褒められても嬉しかねえよってやつに
どう思われようが関係ねーなあ

818 :デフォルトの名無しさん (ワッチョイ 236f-s0Sd):2022/12/25(日) 18:29:48.93 ID:Dw6urQXv0.net
namespace std {
template <class T, std::size_t N>
struct array;
}

みたいに標準ライブラリの前方宣言を自作のヘッダに書くのってやっぱり未定義動作なんですかね?

819 :デフォルトの名無しさん (ワッチョイ cf7c-5mfr):2022/12/25(日) 18:51:26.23 ID:PNih05NQ0.net
stdに勝手に宣言加えていいのは既存テンプレートの特殊化だけ
他は未定義

820 :はちみつ餃子 :2022/12/25(日) 20:29:17.71 ID:8blj/qJt0.net
>>818
原則としては std 名前空間になんらかの宣言や定義を追加したら未定義ということになってる。
https://timsong-cpp.github.io/cppwp/n4861/namespace.std
その事例も該当すると思う。

条件付きで許されている特殊化はあるが C++20 から制限が強化された。
(従来は条件付きで「テンプレートの特殊化を追加できる」だったのが「クラステンプレートの特殊化を追加できる」に改められている。)
ユーザー定義型ごとのカスタマイズを許したい場面では Customization Point Object (CPO) を
活用する方向性なので特殊化でどうにかする必要もないし制限が強くなることはあっても緩和されることはないんじゃないかな。

821 :デフォルトの名無しさん :2022/12/25(日) 21:15:27.65 ID:BoLdymVdF.net
そんな堅苦しい事なんて言わんでもええやん?
どんな弊害があるん?

822 :デフォルトの名無しさん :2022/12/25(日) 22:24:02.06 ID:9/OfwQI/0.net
>>821 標準ライブラリの変更にあたって、 std に宣言追加しているソースへの影響を考えないといけなくなる。

823 :デフォルトの名無しさん :2022/12/25(日) 22:39:45.88 ID:8rnFU1jp0.net
>>822
リンクで失敗するので修正すれば良いだけでは?

824 :デフォルトの名無しさん :2022/12/25(日) 22:40:44.04 ID:8rnFU1jp0.net
「未定義」ってほどには深刻な問題はないと思うんだよね

825 :デフォルトの名無しさん :2022/12/25(日) 23:02:22.44 ID:PNih05NQ0.net
コンパイラがstdに勝手宣言がないことを前提にしたあらゆる最適化の結果を受け入れるなら別にいいと思うよ
俺は絶対に嫌だから関わらないでくれよ

826 :デフォルトの名無しさん :2022/12/25(日) 23:15:00.75 ID:8rnFU1jp0.net
>>825
いやまぁ>>818は俺じゃないので俺も必要性を感じているわけではないけども
具体的に何を恐れているのか分からん

827 :はちみつ餃子 :2022/12/26(月) 01:10:32.66 ID:OBkbHJZM0.net
>>826
何が起きるか具体的にわからないから恐ろしいんだよ。

828 :デフォルトの名無しさん :2022/12/26(月) 01:18:22.88 ID:D/1vl6x80.net
>>827
ワクワクしてこないか?

829 :デフォルトの名無しさん :2022/12/26(月) 01:20:46.52 ID:YnLWxzzl0.net
>>827
oresamaライブラリの中でoresama名前空間があって
arrayが定義されていたとして
oresamaライブラリとは別のプロジェクトで
oresama::array前方宣言したときに
起こりうることは予想がつくよね?
それがstd名前空間だと動作が未定義だとのことだけども
何が違うのか分かります?

830 :デフォルトの名無しさん (ワッチョイ cf7c-5mfr):2022/12/26(月) 01:30:35.37 ID:2gdEMUwk0.net
>>829
コンパイラ様はstd以下を思うままに特別扱いしてカオスでアドホックな最適化処理をいくらでも入れることが許されてる

831 :デフォルトの名無しさん (ワッチョイ b101-jXNG):2022/12/26(月) 01:51:58.67 ID:YnLWxzzl0.net
>>830
>>825も指摘してるけどoresamaとstdの違いはそれくらいだよね?
具体的にどういう最適化をして鼻から悪魔を出すのかな?
まぁそんなことを分かる人はおらんかな...

832 :はちみつ餃子 :2022/12/26(月) 02:20:44.42 ID:OBkbHJZM0.net
>>831
コンパイラの内部に興味を持って調べたいならどんどんやればいいよ。
詳しい人が増えるならそれはたいへん喜ばしい!

でも、リッチな C++ コンパイラのソースコードを読んで様々な最適化がどう組み合わさるかまで把握するのは
相当に高い技能を持った達人でないと無理なのでこのスレ程度ではなんもわからんと思う。
世の中にはこれを保守している人がいるんだからありがたい話だよな。

私がどこかで見たおぼろげな記憶では標準テンプレート関連の一部で
マングルのルールが異なる (名前が短くなるようにしてる?) というのがあるので
変なことをすると破綻することもあるのかもしれない。

833 :デフォルトの名無しさん :2022/12/26(月) 02:29:01.84 ID:2Z6X9F6ZM.net
なぜこうもわざわざ未定義動作を踏み抜きたいやつが多いのか

834 :はちみつ餃子 :2022/12/26(月) 02:33:59.35 ID:OBkbHJZM0.net
コンパイラをナメてるからだろ。
「未定義動作つってもどうせこうなるだろう」という予測が出来ると信じている。
無理なのに。

835 :デフォルトの名無しさん (ワッチョイ 1301-iijX):2022/12/26(月) 05:51:34.26 ID:+xP92Jxa0.net
まあ単なるテンプレートライブラリなのにstdだけを特別扱いして最適化を図るのはちょっとやりすぎな気がしなくもない

836 :デフォルトの名無しさん :2022/12/26(月) 07:41:41.79 ID:zTKHQ8850.net
clangのソースコードはC++プログラムの書き方の勉強になりますね

837 :デフォルトの名無しさん :2022/12/26(月) 08:06:50.83 ID:FVIubv9sd.net
std::arrayってなんらかのusingであることが(コンパイラ側への制限として)許されてたりするんか?

もしarrayの実体がこんな実装だったら
namespase std::__internal {
template<class T, size_t>class array{...};
}
namespase std:: {
template<class T, size_t>using array=__internal<T,size>;
}

勝手にこれ書いたらまずくならんか?
namespase std{
template<class T, size_t>class array;
}

838 :デフォルトの名無しさん :2022/12/26(月) 09:12:05.09 ID:5S/2UDN2d.net
なるね

839 :デフォルトの名無しさん :2022/12/26(月) 11:35:27.15 ID:v25C8vnQ0.net
>>818
それやると特定のC++バージョン、特定のコンパイラでしか
コンパイルできないコードになりかねないし、
普通に #include <array> すればいいだろ。

それともそれが出来ない理由があるとか?

840 :デフォルトの名無しさん :2022/12/26(月) 12:12:38.12 ID:YnLWxzzl0.net
>>832
なるほどマングリング変えられるとリンカーエラーで
しばし悩むかもしれませんね

>>837
これはコンパイルで弾かれるので分かると思います

おふた方とも勉強になりました! 有り難うございます
しかし未定義動作ってほど酷いことにはならないのかなぁと思います
なめてますかね私?

841 :デフォルトの名無しさん :2022/12/26(月) 13:31:39.98 ID:6bMfB0bxa.net
>未定義動作ってほど酷いこと

は?

842 :はちみつ餃子 :2022/12/26(月) 13:38:20.67 ID:OBkbHJZM0.net
>>840
未定義動作と定義されているんだから未定義動作としか言えんだろ。

843 :デフォルトの名無しさん :2022/12/26(月) 13:49:22.29 ID:YnLWxzzl0.net
>>841
未定義動作とはコンパイルもリンクも通って実行できるけど
どんな動作をするか分からない(未定義)ので
事前に分かるコンパイルエラーやリンカーエラーに比べて
「酷い」と表現しました
いわゆる「鼻から悪魔」

844 :デフォルトの名無しさん :2022/12/26(月) 13:51:12.76 ID:YnLWxzzl0.net
>>842
まぁ規格に書かれちゃってるんだからそりゃそうですね

845 :はちみつ餃子 :2022/12/26(月) 14:17:52.01 ID:OBkbHJZM0.net
もしも「必ずエラーとして報告されるべき」みたいな仕様にしたら std の特別扱いが要るから
標準ヘッダのファイルに素朴に書くだけな実装はやりにくくなるし……。

846 :デフォルトの名無しさん :2022/12/26(月) 14:22:21.57 ID:uyDYkqVs0.net
void InitBoard(void) // 盤を初期化
{
int x, y;

for (y = 0; y < YMAX; y++)
{
for (x = 0; x < XMAX; x++)
{
board[x][y] = 0;
}
for (x = 0; x < XMAX; x++)
{
num[x] = 0;
}
}
}

この処理の無駄を省くコードおしえてください

847 :デフォルトの名無しさん :2022/12/26(月) 14:26:27.90 ID:A7MLr6bua.net
>>843
酷いとわかっているのに
なんでこの未定義動作だけ酷くはならないと思えるの?

848 :デフォルトの名無しさん :2022/12/26(月) 14:26:50.08 ID:9plh3gB/d.net
memset(board, 0, sizeof board);
memset(num, 0, sizeof num);

849 :デフォルトの名無しさん :2022/12/26(月) 14:33:45.39 ID:a6eE731v0.net
>>846
つbzero,ZeroMemory

850 :デフォルトの名無しさん :2022/12/26(月) 14:39:30.42 ID:EnLBjT8OM.net
標準に <iosfwd> あるくらいだし動機はわかるけども

あんま詳しくないけどモジュールはよってことなんかね?

851 :デフォルトの名無しさん :2022/12/26(月) 14:44:20.75 ID:2wvNEB42d.net
禁止と言われて、そうですかと聞き分ける人と、ゴネる人がいるってことだ。

852 :デフォルトの名無しさん :2022/12/26(月) 14:49:02.84 ID:YnLWxzzl0.net
>>847
>>821からの流れは
実際に「酷い」鼻から悪魔が出る処理系はないんじゃないかな?って問い掛けです
少なくともここのスレではコンパイルエラーやリンカーエラーになる事例は
指摘がありましたが「酷い」ことになる事例は出ていません(誰かもしあれば?)

なぜそう考えるかは名前空間oresamaでは合法で
名前空間stdのみに規格において例外的な規定がなされているからって程度です
>>845のようにエラーが明示的に出ないのも
酷いことにならんのじゃないかなぁと
私が考えてしまうことに貢献しているかも

853 :はちみつ餃子 :2022/12/26(月) 14:50:30.84 ID:OBkbHJZM0.net
>>846
std::fill を使うのが妥当じゃないかな?

memset でも普通は問題は起きないと思うけど
メモリブロック (バイト列) に対する操作だから board の型によっては
問題が起こることはなくもない。

854 :デフォルトの名無しさん :2022/12/26(月) 14:51:24.85 ID:YnLWxzzl0.net
>>851
そういうことではない

文法的にダブルスタンダードになってるのが気持ち悪い
名前空間stdもoresamaも同じ取り扱いである方が
文法的に美しいって感じているから
実際には最適化のためにstdは特別扱いが規定されている

855 :デフォルトの名無しさん :2022/12/26(月) 15:04:20.66 ID:rUBUe8yFa.net
(自分の環境だと)酷いことにはなってないから
未定義踏んでてもOK派?
勘弁してください

856 :デフォルトの名無しさん :2022/12/26(月) 15:10:52.71 ID:YnLWxzzl0.net
>>855
煽ってものらないよw 誰もそんなことは書いていない

酷いことになる事例を教えてねってことを書いています
どういうこと(最適化?)を想定してダブルスタンダードにしたのか
動機を知りたくないですか?

857 :デフォルトの名無しさん :2022/12/26(月) 15:12:35.95 ID:a6eE731v0.net
fill_n(num,__countof(num),0)
上のboardは自分で考えるんだ

858 :はちみつ餃子 :2022/12/26(月) 15:26:40.53 ID:OBkbHJZM0.net
>>854
自分が作ったライブラリの名前空間に何を追加されても正しく動く (または必ずエラーになる) ように保証してんのか?
各ライブラリごとの挙動に保証していることと保証してないことがあるのは当たり前のことだろ。
お前のライブラリについての保証はお前がするから「言語では」関知しないってだけで、
oresama に何を追加してもよいことが保証されてるわけではない。

859 :デフォルトの名無しさん :2022/12/26(月) 16:14:39.95 ID:YnLWxzzl0.net
>>858
たぶん伝わってないな
以下をユーザが自分のソースに書くのは>>820の言うように規格で禁じられている
namespace std {
template <class T, std::size_t N>
struct array;
}
同じくoresama::ARRAYなるカスタムのクラステンプレートが定義されていたとして
以下をユーザがソースに書くのは合法
namespace oresama {
template <class T, std::size_t N>
struct ARRAY;
}
これをダブルスタンダードで気持ちが悪いと思っている
最適化との説だけども
具体的なことを知っている人がいたら聞きたいな

860 :デフォルトの名無しさん :2022/12/26(月) 16:17:49.67 ID:+99B24rl0.net
>>846
そのboard[x[][y]はゼロフィルしても良い配列?
盤外に飛び出す桂馬飛びの高速判定テクニックとして実はboard[-1][-2]が壁のコードになっている
とかありそう
※ 全くの想像です
※ 未定義動作と言われても知らそんこの場合アセンブリコードが正しくて速ければええんじゃ
※ この場合2次元配列はやめてカラム数が2のべきの1次元配列であるべき
※ ここまで全くの妄想です

861 :デフォルトの名無しさん :2022/12/26(月) 16:19:44.55 ID:+99B24rl0.net
説明が抜けた;;;
board[-1][-2]が壁のコードになるような思想の場合は
board[0..][0..]にも当然盤を取り囲むように壁のコードが配置される

862 :はちみつ餃子 :2022/12/26(月) 16:26:57.23 ID:OBkbHJZM0.net
>>859
お前のライブラリの仕様はお前が決める、
標準ライブラリの仕様は言語仕様で決める。
そこになんの違いもありゃしねぇだろうが

863 :デフォルトの名無しさん :2022/12/26(月) 16:30:53.99 ID:/571GBxYM.net
>>862
一行目は違う
oresama::ARRAYの前方宣言が合法なのは
文法で規定されている

864 :はちみつ餃子 :2022/12/26(月) 16:34:00.09 ID:OBkbHJZM0.net
>>863
No.
許されているのはそのライブラリの設計がそうなっているからで許さない仕様のライブラリはあり得る。

865 :デフォルトの名無しさん :2022/12/26(月) 16:44:01.34 ID:/571GBxYM.net
>>864
前方宣言を許さない設計なんて本当にあるの?

866 :デフォルトの名無しさん :2022/12/26(月) 16:54:23.72 ID:QSsdq8qk0.net
>>865 あるよ。標準ライブラリがそう。

867 :デフォルトの名無しさん :2022/12/26(月) 16:55:15.06 ID:zTKHQ8850.net
かまってちゃん

868 :はちみつ餃子 :2022/12/26(月) 16:55:21.28 ID:OBkbHJZM0.net
>>865
すでに >>837 で示されてる。 見かけ上の名前は別名であるかもしれない。
別名ではない実装で書かれていることがはっきりしていて将来も変更されないと oresama::ARRAY について
保証されているならそれをあてにしてもいいんじゃないの。
で、それを保証するかどうかはライブラリを作ったやつの裁量次第。

869 :デフォルトの名無しさん :2022/12/26(月) 17:07:33.78 ID:/571GBxYM.net
>>866
誰か突っ込んでくれると思ってた
有難う!

870 :デフォルトの名無しさん :2022/12/26(月) 17:11:08.06 ID:+99B24rl0.net
namespaceはシンボルの衝突を防ぐためのしくみなのに
後から要素を追加できる仕様の方がおかしいfinalizeできるべき

だいたいnamespace oresama にX=サンが "bar.h" にて void oresama:foo()を定義して、
C++の標準ライブラリ仕様しか見ていないY=サンが "baz.h" にて同じシグネチャで異なる実装の
void oresama:foo() が実装されてしまう危険性が避けられない
のだから第三者によるnamespace内への後付けは本来言われるまでも無く禁止されるべき事項、

同一シグネチャで異なる実装があったらリンク時にエラーになる、と気体することは場合に掘っては全くできない
http://0xcc.net/blog/archives/000060.html

ちなVS2010だともっと簡単に(スタティックリンクでも)起こせるorz

871 :デフォルトの名無しさん :2022/12/26(月) 17:13:25.25 ID:+99B24rl0.net
訂正orz
誤1: C++の標準ライブラリ仕様しか見ていないY=サン
正1: oresamaのオリジナルの仕様書しか見ていないY=サン

誤2: 場合に掘っては全く
正2: 場合によっては全く

872 :デフォルトの名無しさん :2022/12/26(月) 17:15:26.88 ID:/571GBxYM.net
>>868
話がズレている
前方宣言は規格で合法だよ
(ただし名前空間std内を除く)
鼻から悪魔は出ない...と思う

873 :はちみつ餃子 :2022/12/26(月) 17:58:37.42 ID:OBkbHJZM0.net
>>872
前方宣言自体はいいよ。
そのライブラリ内でどう定義されているかわかっていて**妥当な前方宣言を出来るなら**。
将来のライブラリの更新があっても妥当でありつづける (または妥当でなくなったときに追従する) なら。

いちいちライブラリが保証していない内部仕様を調査して妥当かどうか確かめなきゃならない、どんな干渉が起きるかわからない
ってのは (ライブラリの仕様としては) 未定義じゃろ。

874 :デフォルトの名無しさん :2022/12/26(月) 18:28:18.27 ID:gLGPMU9jd.net
>>854
タブスタって何が?
stdに勝手に追加やってみた?
コンパイル通るぞ
文法的にどうのということと
できることとやっていいことは違うということを
区別しているか?

875 :デフォルトの名無しさん :2022/12/26(月) 18:40:09.55 ID:+xP92Jxa0.net
>>846
C言語はboard[x][y]のy側が連続に配置されるから for(x = ...){ for(y = ...){ ... } } の順にネストした方が効率的になる可能性が高いので俺なら
for (x = 0; x < XMAX; x++){
for (y = 0; y < YMAX; y++){
board[x][y] = 0;
}
num[x] = 0;
}
って書くと思う

876 :デフォルトの名無しさん :2022/12/26(月) 21:17:05.02 ID:YnLWxzzl0.net
>>873
前方宣言ってヘッダを見てやるから
逆に妥当でない前方宣言ってどんな場合のことを書いているのですか?
内部仕様を調査する必要もないと思うのですが?

877 :デフォルトの名無しさん :2022/12/26(月) 21:18:30.60 ID:YnLWxzzl0.net
>>874
>>859の通り

878 :デフォルトの名無しさん :2022/12/26(月) 21:37:30.08 ID:2gdEMUwk0.net
前方宣言のつもりがこういうので意味変わっても知らんぞ
http://d.hatena.ne.jp/DigitalGhost/20090216/1234793122

879 :デフォルトの名無しさん :2022/12/26(月) 21:37:34.67 ID:Luv0983hM.net
oresama 名前空間に前方宣言が追加されると未定義動作になるような例って実際作れる?
std についてはコンパイラマジックでも何でもありだが

880 :デフォルトの名無しさん :2022/12/26(月) 21:47:21.55 ID:6ywYYiev0.net
未定義動作は未定義だよ

意図通り動いても、
デバッグするのに便利な例外が投げられても、
まともに動いてるように見えてメモリ壊してても、
コンパイルエラーになっても問題ない

コンパイラと実行環境は求められる動作が決まってないから

881 :デフォルトの名無しさん :2022/12/26(月) 22:12:49.76 ID:NZGNd7w4d.net
変な宣言が追加されるとSFINAEが狂うパターンとかあるかも。

882 :デフォルトの名無しさん :2022/12/26(月) 23:28:38.90 ID:8d7AMOhX0.net
>>877
できることとやっていいことは違うということを区別してるかとあんたに聞いているんだ
そこに他人の発言を持ち出す余地はない

答えに窮しているんなら駄レスしねえで黙ってろ

883 :デフォルトの名無しさん :2022/12/26(月) 23:47:11.05 ID:5EhwIIVK0.net
はちみつはもう冬休みなのか。裏山

884 :デフォルトの名無しさん :2022/12/26(月) 23:57:12.44 ID:YnLWxzzl0.net
>>882
>>859に書いてあるから読みたまえ

885 :デフォルトの名無しさん :2022/12/27(火) 00:01:58.89 ID:QO3hLMTW0.net
>>820
思ったんだけどさ前方宣言は`declarations'に入ってないってことはないかな?
以下が原文なんだけども
>Unless otherwise specified, the behavior of a C++ program is undefined
>if it adds declarations or definitions to namespace std or to a
>namespace within namespace std.
文からは入ってるとも入ってないとも俺には判断がつかない
確かな見解がある人はいるかな?

886 :デフォルトの名無しさん :2022/12/27(火) 00:11:56.45 ID:9ztV+U0x0.net
>>884
答えに窮しているんなら駄レスしねえで黙ってろ
てめーの言葉で語れないフリーライダーが
生産性のないやつはプログラマのゴミの中のゴミだ

887 :デフォルトの名無しさん :2022/12/27(火) 00:13:15.81 ID:fnhKiHjQ0.net
>>884 >859の言う「ダブルスタンダード」は>862-864で否定されて終わってるだろ。

888 :デフォルトの名無しさん :2022/12/27(火) 00:14:08.27 ID:QO3hLMTW0.net
>>886
>>859は俺の投稿だよw

889 :デフォルトの名無しさん :2022/12/27(火) 00:16:20.11 ID:9ztV+U0x0.net
>>888
ゴミめ

890 :デフォルトの名無しさん :2022/12/27(火) 00:18:30.98 ID:9ztV+U0x0.net
ヘッダファイルそのものを改造することだってできる
ISO/IEC14882のヘッダファイルだけ改造しちゃいけなくて
それ以外のヘッダファイルは改造していいことにしたいのかよ
ダブスタだからって? バカか

891 :デフォルトの名無しさん :2022/12/27(火) 00:20:13.94 ID:9ztV+U0x0.net
標準のヘッダファイルを書き換えるななんてバカ用の説明が規格票の中に書いてあるかどうか知らんが
そういうレベルの屁理屈ならべてんなボケが

892 :デフォルトの名無しさん :2022/12/27(火) 00:21:11.64 ID:QO3hLMTW0.net
>>887
>>865以降も読んでくれ給え
前方宣言で鼻から悪魔が出るケースは名前空間std以外ではない
コンパイルエラーやリンカーエラーで弾ける

名前空間stdでもないと思い始めている
規格の`declarations'は普通の宣言のことで
前方宣言はこれに入らない説に傾いてきた

893 :デフォルトの名無しさん :2022/12/27(火) 00:22:43.58 ID:QO3hLMTW0.net
>>889
3行目に書いてあるから読みなよ

894 :デフォルトの名無しさん :2022/12/27(火) 00:23:47.05 ID:QO3hLMTW0.net
>>890,891
何で標準のヘッダファイルを書き換える話を始めてるの?

895 :デフォルトの名無しさん :2022/12/27(火) 00:28:00.93 ID:QO3hLMTW0.net
>>820
>>>818
>原則としては std 名前空間になんらかの宣言や定義を追加したら未定義ということになってる。
>https://timsong-cpp.github.io/cppwp/n4861/namespace.std
>その事例も該当すると思う。
これが正しいかもしれんし違うかもしれん

896 :デフォルトの名無しさん :2022/12/27(火) 00:33:27.20 ID:9ztV+U0x0.net
>>893
うるせえ命令すんな
読んで欲しければ読みたくなるようにお前が努力しろカス

897 :デフォルトの名無しさん :2022/12/27(火) 00:34:29.25 ID:9ztV+U0x0.net
>>894
一緒だろうがよ
stdの中に働きかけて動作を変えようって話だろ
stdだけそれをするなというのがダブスタなんだろ

898 :デフォルトの名無しさん :2022/12/27(火) 00:36:22.67 ID:QO3hLMTW0.net
>>896
俺は優しいからね

>>859
>以下をユーザが自分のソースに書くのは>>820の言うように規格で禁じられている
>namespace std {
> template <class T, std::size_t N>
> struct array;
>}
規格で禁じられていると書いている人間が
「できることとやっていいことは違うということを区別して」いないわけなかろう

899 :デフォルトの名無しさん :2022/12/27(火) 00:36:52.90 ID:9ztV+U0x0.net
作者がするなということをなぜしたいんだよ
脱獄したきゃ勝手にやってろ
誰も止めやしねえよ
バカ一匹どうなろうが誰も知ったこっちゃねえ

900 :デフォルトの名無しさん :2022/12/27(火) 00:37:18.87 ID:QO3hLMTW0.net
>>897
>stdの中に働きかけて動作を変えようって話だろ
違います

901 :デフォルトの名無しさん :2022/12/27(火) 00:41:27.03 ID:QO3hLMTW0.net
>>899
規格の英文が曖昧だから読み間違えてんじゃないの?
って思い始めてる

902 :デフォルトの名無しさん :2022/12/27(火) 00:42:11.81 ID:9ztV+U0x0.net
ああそうかい
勝手に思ってな

903 :デフォルトの名無しさん :2022/12/27(火) 00:43:47.73 ID:QO3hLMTW0.net
>>902
規格は読んだのかな?

904 :デフォルトの名無しさん :2022/12/27(火) 00:47:28.29 ID:R1/11RYB0.net
>>879
>>870 ドヤア

905 :デフォルトの名無しさん :2022/12/27(火) 00:49:39.31 ID:QO3hLMTW0.net
>>904
定義を書いたらこの問題は起こるね
前方宣言では起こらない

906 :デフォルトの名無しさん :2022/12/27(火) 00:50:13.48 ID:R1/11RYB0.net
「勝手に」が抜けてたorz
X=サンが*勝手*に追加した "bar.h" にて void oresama:foo()を定義のを知らずに
Y=サンが "baz.h" にて同じシグネチャで異なる実装の void oresama:foo() が実装されてしまう
と言う場合は覿面に意図しない動きになる(ことがある

907 :デフォルトの名無しさん :2022/12/27(火) 00:51:22.27 ID:R1/11RYB0.net
>>905
定義の無い前方宣言とか何のためにするんじゃ……

908 :デフォルトの名無しさん :2022/12/27(火) 00:53:18.15 ID:QO3hLMTW0.net
>>870はリンカーがチェックすればこの問題は起こらないはずなんだけど
意図的にオーバライドできるようになってるとか
何かで読んだ気がする...

909 :デフォルトの名無しさん :2022/12/27(火) 00:54:50.91 ID:QO3hLMTW0.net
>>907
ヘッダをできるだけincludeしたくないから
ヘッダをincludeしたくないのは依存ヘッダを減らしたいから
みんなpimplとかで前方宣言してるやろ?

910 :デフォルトの名無しさん :2022/12/27(火) 00:54:51.28 ID:9ztV+U0x0.net
>>903
読んでるよ
どのくらいか指定がないからどうにでも言えるw

苦し紛れに何が言いたかったのかな

911 :デフォルトの名無しさん :2022/12/27(火) 00:56:18.99 ID:QO3hLMTW0.net
>>910
ではあなたは`declarations'に
前方宣言が含まれるとの見解でよろしいか?

912 :デフォルトの名無しさん :2022/12/27(火) 00:58:30.57 ID:9ztV+U0x0.net
>>911
前方宣言て何? JIS X3014の規格票を検索してもヒットしないんだが

913 :デフォルトの名無しさん :2022/12/27(火) 00:59:25.89 ID:QO3hLMTW0.net
forward declarationじゃないかな? ない?

914 :デフォルトの名無しさん :2022/12/27(火) 01:03:39.45 ID:9ztV+U0x0.net
さあ知らんね
おまえの曖昧さを俺が処理してやる義理はない

915 :デフォルトの名無しさん :2022/12/27(火) 01:06:05.88 ID:9ztV+U0x0.net
技術板で煽りネタが英語力とかくだらんな
英語圏在住のバカと同類だってアピールしたら格好いいんかよw

916 :デフォルトの名無しさん :2022/12/27(火) 01:08:38.87 ID:QO3hLMTW0.net
>>915
規格が英語で書かれてるんだから仕方ないじゃないか

>>914
威勢が良い割には逃亡か
根性がねーな

917 :デフォルトの名無しさん :2022/12/27(火) 01:12:56.49 ID:9ztV+U0x0.net
煽っても無駄だよ
義理のないことの特別サービスをさせたいようだが
世の中そう甘くはない

暇人と違って明日も朝から仕事なんだよ
バイバイ

918 :デフォルトの名無しさん :2022/12/27(火) 01:14:43.51 ID:QO3hLMTW0.net
>>916
おまいさんは威勢よく俺を煽ってたけども
規格も読んでなかったということだ
根拠としたのは恐らく>>820の書き込みのみ
俺は純真なので痛く傷ついたんだよ
他人の言説を無批判に信じて自らは確かめることなく
人を攻撃することはやめてくれ

919 :はちみつ餃子 :2022/12/27(火) 01:34:54.20 ID:G9AKlNLO0.net
前方宣言が宣言でない可能性なんて考えたこともなかったが
たとえば単にポインタと書いてあるときにメンバ関数ポインタを含んでなかったりすることを
思い出せば変な用語になってる可能性は考慮にいれるという姿勢は必要かもしれない。

あらためて検討してみたところ、前方宣言という用語の直接的な定義はないが仕様中で
前方宣言 (forward declaration) と呼ばれているものは宣言に該当するし、
単に宣言の位置が前方である宣言のことを前方宣言と呼んでいると解しても良いと思う。

920 :デフォルトの名無しさん :2022/12/27(火) 02:38:42.00 ID:Kk7zAeAV0.net
未定義動作だから宣言禁止してるんじゃない
宣言禁止してるから未定義動作になったんだ

921 :デフォルトの名無しさん :2022/12/27(火) 02:48:53.38 ID:fnhKiHjQ0.net
>>892
>865の質問は>866,868で答えが出てて、その前の話に影響無いし・・・と読み進めると
>872で「前方宣言は規格で合法」とかいう当たり前に見える意味不明な話につづいており・・・

どうも>859以降の「合法」が↓のようなよくある解釈とは違うようであることに気付いた。
https://cpprefjp.github.io/implementation-compliance.html
> 合法 (legal)・違法 (illegal): これらの語はプログラムに対しても慣用されるが、具体的な意味は明確でない。 プログラムの正しさには複数の水準があるためである。 適格、またはすべての規則を満たす、または未定義の動作を含まないなどが考えられる。
明確な言葉で言い換えられるまで下手に考えても不毛そう。

「前方宣言は」というのも「ユーザー側コードに~な前方宣言を加えて利用していた場合にライブラリ更新があっても~」
とかいう意味になりそうだけど端折りすぎて意味不明になってる。

「鼻から悪魔」は未定義動作と同じ意味のつもりで使ってそうだけどコンパイルエラーやリンクエラーは除くようでもあり
これも未定義動作とは違う何か。

さっきキレちらかしてた人もこんな感じで我慢できなくなったんだろう。
明確な用語を使うように気を付けて主張を整理しないと、君とまともに会話してくれる人居なくなると思うよ。

922 :デフォルトの名無しさん :2022/12/27(火) 07:37:18.96 ID:GSvWJ+1+0.net
「天才のぼくちんの完璧なレスを理解できない無能なお前らが悪い!」って暴れ出すいつもの奴だからもう放っとけよ

923 :デフォルトの名無しさん :2022/12/27(火) 07:46:03.70 ID:nX/ozHbV0.net
事実と挙動だけ書けばいい

924 :デフォルトの名無しさん :2022/12/27(火) 08:04:36.52 ID:l/ni+ylad.net
ハッシュ小僧か

925 :デフォルトの名無しさん :2022/12/27(火) 11:12:03.63 ID:QO3hLMTW0.net
>>921
鼻から悪魔はコンパイルエラーやリンカーエラーは当然含まない
何人か知らないようだけどもひょっとして自演してるの?

926 :デフォルトの名無しさん :2022/12/27(火) 11:18:29.54 ID:QO3hLMTW0.net
>>921
したがって>>865の答えは出ていない
名前空間stdは>>820のdeclarationsに
前方宣言が入るとは限らないので
答えにはならない

それと俺は天才くんとは別人
横からちゃちゃ入れてる人だよ

927 :デフォルトの名無しさん :2022/12/27(火) 11:39:33.69 ID:2fUOYjFgd.net
はいはい、別人なんでちゅね~
ニヤニヤ

928 :デフォルトの名無しさん :2022/12/27(火) 11:43:36.77 ID:QO3hLMTW0.net
>>927
例えば>>654が俺だよ

929 :デフォルトの名無しさん :2022/12/27(火) 11:44:56.74 ID:2fUOYjFgd.net
それでそれで?

930 :デフォルトの名無しさん :2022/12/27(火) 11:45:14.64 ID:QO3hLMTW0.net
おんなじワッチョイ検索してね

931 :デフォルトの名無しさん :2022/12/27(火) 11:45:28.77 ID:fnhKiHjQ0.net
「いつもの奴」が一人ということも無いからな。悲しいことに。

コテハン付けてくれない?

932 :デフォルトの名無しさん :2022/12/27(火) 11:46:04.33 ID:QO3hLMTW0.net
天才くんほどの実力はないです

933 :デフォルトの名無しさん :2022/12/27(火) 11:46:30.13 ID:QO3hLMTW0.net
>>931
どうやってつけるの?

934 :デフォルトの名無しさん :2022/12/27(火) 11:58:22.17 ID:fnhKiHjQ0.net
>>933 https://www.google.com/search?q=5ch+%E3%83%88%E3%83%AA%E3%83%83%E3%83%97

935 :天災 :2022/12/27(火) 12:02:33.04 ID:QO3hLMTW0.net
>>934
Thanks!

936 :デフォルトの名無しさん (ブーイモ MM21-5fcg):2022/12/27(火) 12:03:58.07 ID:ifNnQS7gM.net
>>837
本題と関係ないけどこれって CTAD 関連含めて挙動完全に大丈夫なんか?少なくとも C++17 ではダメだが

937 :天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG):2022/12/27(火) 12:04:16.27 ID:QO3hLMTW0.net
俺は天才なんて呼ばれたことはないが
天才と呼ばれた人だこのスレで呼ばれたw

938 :天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG):2022/12/27(火) 12:04:54.10 ID:QO3hLMTW0.net
天才と呼ばれた人だ<と>このスレで呼ばれたw

939 :デフォルトの名無しさん (ワッチョイ 6d5f-aH43):2022/12/27(火) 12:12:33.94 ID:fnhKiHjQ0.net
ありがとうございます。助かります。

940 :天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG):2022/12/27(火) 12:13:50.33 ID:QO3hLMTW0.net
いえこちらこそ

941 :デフォルトの名無しさん (スッップ Sd57-Xl/E):2022/12/27(火) 12:17:08.49 ID:XYKyOOkrd.net
>>865の結論て>>866で終わってると思うんだけど
前方宣言がdeclarationじゃないとか曲解だろ
たまたま先に同じ型で宣言するという技法がテクニックとして成立するだけ

942 :天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG):2022/12/27(火) 12:29:08.28 ID:QO3hLMTW0.net
前方宣言が確かに>>820の`declarations'に含まれる根拠があれば示して下さい
前方宣言で鼻から悪魔が出ることは
懸案事項の名前空間stdの場合は保留として他にないと思う
>>837はコンパイルエラーで弾かれるので鼻から悪魔は出ない
あれば教えて下さい

943 :デフォルトの名無しさん :2022/12/27(火) 12:55:07.85 ID:XYKyOOkrd.net
まずあなたがどっちもdeclarationなのにただのテクニックである前方宣言が含まれない理由を示すべきだろう

944 :天災 :2022/12/27(火) 13:01:14.48 ID:QO3hLMTW0.net
>>943
俺は入るとも入らないとも根拠がないので保留だよ
どちらかの根拠があれば解決だね

945 :デフォルトの名無しさん :2022/12/27(火) 13:09:43.62 ID:WVVp8u06d.net
>>925
コンパイルエラーやリンクエラーも未定義動作で起こりうる事の一つなんだけど
どういう理屈で鼻から悪魔から除外されるの?

946 :デフォルトの名無しさん :2022/12/27(火) 13:10:56.66 ID:8Y7pY2Mbd.net
それは違うだろ

947 :デフォルトの名無しさん :2022/12/27(火) 13:18:26.61 ID:WVVp8u06d.net
違わないよ
何でも起こりうるのが未定義動作だ
お前はコンパイルエラーの方が鼻悪魔出現よりも非現実度が高いと思ってるの?

948 :天災 :2022/12/27(火) 13:19:13.33 ID:QO3hLMTW0.net
>>945
コンパイルエラーやリンクエラー -> 動作しない
未定義動作 -> 動作する

949 :デフォルトの名無しさん :2022/12/27(火) 13:22:50.11 ID:WVVp8u06d.net
現実的な話としては、未定義動作静的解析で見つけ出してillーformed扱いしてコンパイル拒否するコンパイラがあったとして、それは規格違反ではない
当たり前だろ、だって未定義なんだから

950 :デフォルトの名無しさん :2022/12/27(火) 13:23:40.85 ID:XYKyOOkrd.net
>>944
まず前方宣言がdeclarationという仕様のそとにある可能性を示してくれないと
前方宣言ってdeclarationの言語仕様外の動作してるの?

951 :デフォルトの名無しさん :2022/12/27(火) 13:24:42.77 ID:WVVp8u06d.net
>>948
未定義動作の「動作」(undefined behaviourのbehaviour)は実行時動作だけ意味してるわけじゃない

952 :天災 :2022/12/27(火) 13:27:30.62 ID:QO3hLMTW0.net
>>950
俺も昨日から規格をあたってるけど見つからんのだよ
Cの規格を見れば良いのかな?

953 :天災 :2022/12/27(火) 13:35:30.55 ID:QO3hLMTW0.net
>>951
初めて聞いたよ

954 :デフォルトの名無しさん :2022/12/27(火) 13:35:53.60 ID:8Y7pY2Mbd.net
>>951
通らない部分は未定義動作のまま残して良いわけだけど
コンパイルが通らないとなると問題だ

955 :デフォルトの名無しさん :2022/12/27(火) 13:43:49.52 ID:WVVp8u06d.net
>>954
何が問題なの?何だろうと問題にしないのが未定義という事だぞ
それ以上言うなら「未定義といえどもコンパイルとリンクは必ず通らなければならない」って規格書に書いてある場所提示してね

956 :天災 :2022/12/27(火) 13:44:55.47 ID:QO3hLMTW0.net
ソースがWikipediaで申し訳ないが
未定義動作とはコンパイルやリンクを通るものを言う
https://ja.wikipedia.org/wiki/%E6%9C%AA%E5%AE%9A%E7%BE%A9%E5%8B%95%E4%BD%9C

名前空間stdにビルドできるコードを追加しても
動作が意図通りになるか分からんよ
動作は未定義だよってのが>>820の指摘だよ

957 :デフォルトの名無しさん :2022/12/27(火) 13:46:12.79 ID:8Y7pY2Mbd.net
未定義じゃなくても「必ず通らなきゃならない」なんて記述はないと思うけど

958 :デフォルトの名無しさん :2022/12/27(火) 13:56:51.44 ID:fnhKiHjQ0.net
>>956 ちがうんだよなぁ。
> CやC++の場合、コンパイラはコンパイル時に未定義動作のチェックを行うことができる

よりC++規格に即した>921のリンク先も見てね。

959 :デフォルトの名無しさん :2022/12/27(火) 13:57:29.46 ID:XYKyOOkrd.net
>>952
普通にdeclaration and definitionの項でも読んでれば良いんじゃないの

前方宣言特有の動作があるのにここにないなら別である可能性も考えて良い

960 :デフォルトの名無しさん :2022/12/27(火) 13:59:01.95 ID:WVVp8u06d.net
>>956
ゴミ持って来んな
しかもそのゴミにもコンパイル前にチェックしてもいい(しなくてもいい)って書いてあるやんけ
>>957
コンパイル出来なかったら問題だとかいう寝言言い出したのはお前の方だろうが

961 :デフォルトの名無しさん :2022/12/27(火) 13:59:36.79 ID:fnhKiHjQ0.net
>>957 あるよ。 https://timsong-cpp.github.io/cppwp/n4861/intro.compliance#2.1

962 :はちみつ餃子 :2022/12/27(火) 14:01:35.95 ID:G9AKlNLO0.net
>>956
仕様上の定義では未定義の挙動は翻訳中にも生じる。

> https://timsong-cpp.github.io/cppwp/n4861/defns.undefined
> during translation or program execution

963 :天災 :2022/12/27(火) 14:23:44.32 ID:QO3hLMTW0.net
>>962
ホントだねw

Wikipediaにあるようにコンパイルもリンクも通って
実行はできるときに使うことが多いと思ってたけども

964 :デフォルトの名無しさん :2022/12/27(火) 14:42:36.98 ID:kLAEuBfs0.net
>>956
未定義動作はc++標準の規定外というだけで、エラーになるかどうかは全く関係無い。エラーにしてもエラーにしなくてもc++標準には違反しない。

www.open-std.org/jtc1/sc22/wg21/docs/standards
N4849.
3.28 未定義の動作
この文書が要求していない動作
[項目への注記 1: 未定義の動作は,この文書が動作の明示的な定義を省略したとき,又はプログラムが誤った構成又は誤ったデータを使用したときに予想されるかもしれない。
未定義動作は,この文書が動作の明示的な定義を省略した場合又はプログラムが誤った構成若しくは誤ったデータを使用した場合に想定される。許容される未定義の動作
予測できない結果をもたらす状況の完全な無視から、翻訳中またはプログラム実行中に特徴的な文書化された方法で動作することまで、許容される未定義動作の範囲があります。
環境に応じて文書化された方法でプログラムの実行を行う(診断メッセージの発行の有無は問わない)。
また、翻訳や実行を終了する(診断メッセージを発行する)こともあります。)
多くの誤ったプログラム構成は、未定義の動作を発生させるものではなく、診断が必要なものである。
定数式の評価は、本書第 4 条から第 15 条で明示的に未定義と指定された動作にはならない。
から第15項(7.7)までに明示的に未定義と指定された動作を示すことはない。- エンディングノート]

965 :天災 :2022/12/27(火) 14:53:01.92 ID:QO3hLMTW0.net
>>964
有難う
用語は注意して使わないとね

>>865の質問を正確にすると
前方宣言を自分のソースに追加すると
ビルドはできるが動作が未定義となる設計は本当にあるの?
(もちろんstdは懸案事項なので保留するとしてそれ以外でね)

966 :デフォルトの名無しさん :2022/12/27(火) 15:32:40.76 ID:XYKyOOkrd.net
stdだと未定義とするって仕様なのにstd保留してどうするんだ
未定義にならずにコンパイラが仕様通りの解釈して動作するだけだろ

967 :はちみつ餃子 :2022/12/27(火) 15:37:36.05 ID:G9AKlNLO0.net
言語的には仕様通りの解釈をするがそれがそのライブラリにとって想定外であるような、
つまり本来の動作と異なる結果を引きおこすような形での前方宣言がありうるかという意味だろ。

968 :はちみつ餃子 :2022/12/27(火) 15:58:07.39 ID:G9AKlNLO0.net
それっぽい例を作れた!
https://wandbox.org/permlink/6utNhLox1WhOaBV8

とはいっても適切な前方宣言になっていないから起こっていることではあるので、
「ヘッダを見て間違いなく前方宣言としては適切になるように書いたけど挙動には影響ある」という例にはなってない。

969 :天災 :2022/12/27(火) 16:01:30.79 ID:QO3hLMTW0.net
>>966
話が通じんなw
その仕様を俺は疑っているから保留
正確に言うとdeclarationsに前方宣言は含まないかもしれんと思っている

970 :デフォルトの名無しさん (ワッチョイ 73f0-4Ar3):2022/12/27(火) 19:17:57.55 ID:7IKxcRBS0.net
じゃ小学生の自由研究の時期が終わったら呼んでください

971 :デフォルトの名無しさん :2022/12/27(火) 20:34:13.81 ID:AOBUz6/T0.net
ボクちゃんの痛い自由研究
「stdネームスペースに落書き」

972 :デフォルトの名無しさん :2022/12/27(火) 21:38:26.75 ID:Q5qxYeje0.net
じゃあ、ISOで未定義の時は、コンパイラの仕様を調べて使えば良いのでは?

973 :デフォルトの名無しさん :2022/12/27(火) 21:40:51.41 ID:FdHzEXmap.net
移植とかでコンパイラ変わったら意図しない実行するとか平気ならな

974 :天災 :2022/12/27(火) 22:06:21.35 ID:QO3hLMTW0.net
>>968
確かに前方宣言で挙動変わるね
しかしこのトリッキーな例をもって
前方宣言を自分の管理外の名前空間(std以外でも)に
追加するのが危険と言って良いものかは正直悩む

975 :天災 :2022/12/27(火) 22:15:15.29 ID:QO3hLMTW0.net
>>972,973
俺は絶対にstdはいじらないね

976 :デフォルトの名無しさん :2022/12/27(火) 22:17:12.44 ID:Q5qxYeje0.net
じゃあ俺もそうする。

977 :デフォルトの名無しさん :2022/12/27(火) 22:18:07.71 ID:xkGd3ITG0.net
自作クラスでendlなどのマニピュレータをオーバーライドするにはstd名前空間に入れるしかないじゃない?

978 :デフォルトの名無しさん :2022/12/27(火) 22:19:58.45 ID:Kk7zAeAV0.net
つうかstdが「標準である」と言う設計上前方宣言を禁止したから仕様上未定義動作となっただけの話で
危険だから前方宣言すべきじゃないって話じゃないと思うよ
結果的にコンパイラ側がそれを逆手にとって最適化とか推し進めた形になったとしてもね

前方宣言許さない仕様のライブラリって言うのは危険だからじゃなく
勝手に拡張すること許さないと決めたライブラリであるというだけの話で

979 :デフォルトの名無しさん :2022/12/27(火) 22:24:30.48 ID:Q5qxYeje0.net
>>977
ストリームはホント腹立つよな。
ぶっ飛ばしたくなってきた。
30年くらい怒りが収まらん。

980 :天災 :2022/12/27(火) 22:55:56.41 ID:QO3hLMTW0.net
随分と古参なんですね

981 :デフォルトの名無しさん (ワッチョイ 95da-Axul):2022/12/27(火) 23:15:16.94 ID:AOBUz6/T0.net
>>977
バカが設計したからなアレ

982 :デフォルトの名無しさん (ワッチョイ 9fea-ij7E):2022/12/27(火) 23:26:06.87 ID:VvvSD8wK0.net
ostream と istream の別の建てつけなので、ファイルポインタもこの二つのクラスで別なんだろうと思っていたら、土壇場で、実はファイルポインタは共有していましたぁ
とか勘弁してほしいと痛切におもいましたねえ

983 :デフォルトの名無しさん (ブーイモ MM21-5fcg):2022/12/27(火) 23:28:14.07 ID:2qRZfHzrM.net
>>968
これ面白いな

984 :天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG):2022/12/28(水) 00:50:07.21 ID:YU/L8pIp0.net
無名namespaceで囲ってるとこが変態

985 :デフォルトの名無しさん :2022/12/28(水) 08:09:55.49 ID:jVoOqLVQM.net
>>978
そういうのは「改造c++」とでも言うべきもので、個々の具体的な実装を挙げて話すべき話題。
具体的な実装の無い「改造c++」なんて「オレ言語」でしかないから、話題にしても相手にするヤツは居ないよ。興味無い。

986 :デフォルトの名無しさん :2022/12/28(水) 16:02:37.97 ID:wx2BQ76Ga.net
>>981
まさかプロトタイプが30年後も使い続けてるとは思わなかったんだよ

987 :はちみつ餃子 :2022/12/29(木) 22:47:04.14 ID:J2+EgPHK0.net
>>974
「わからない」という状態が最大のリスクだ。 精査して事情を把握してからやる分にはいいよ。
だけど少なくとも私はいちいちライブラリの細かいことなんて調べたくないし、
細部の事情まで読み解ける自信はないから製作者の意図 (仕様として明示されている範囲) を超える
ような使い方をあえてすることはないだろうという話。 要するに割に合わない。
しなくていいことはせずに済ませられたらそのほうがいいだろ。

割に合うと考えている人がいたとしたら
「んなわけねーだろ。 お前が調べるのに労力をかけてないだけ」
と思うから安易にやっちゃうやつはちょっとナメてるように感じる。

そりゃあ他に打てる手がなければ割に合わなくてもやらざるを得ないことだってあるだろうけどさぁ。

988 :デフォルトの名無しさん :2022/12/30(金) 07:37:06.73 ID:zn+Ud9N00.net
本当に余計なお世話だけど、はちみつさんのような実力がある人は
むしろライブラリやコンパイラのソースを読んだ方がいいよ

989 :デフォルトの名無しさん :2022/12/30(金) 10:24:58.07 ID:O3GOnLRpa.net
>>988
おまえは仕事した方がいい

990 :デフォルトの名無しさん :2022/12/30(金) 11:11:02.33 ID:l10vdbnHr.net
火の玉ストレートやめたれ

991 :デフォルトの名無しさん :2022/12/30(金) 13:31:38.92 ID:p0azBXIn0.net
std名前空間への勝手要素追加は未定義動作と書かれているのに
std名前空間内のクラスへのメンバ追加についてはなんで言及が無いのやろうな……
名前空間もクラスもPGの責任分担範囲の区切りみたいなもんで、
第三者に後から勝手に弄られたら設計したPGが困るのは同じだと思うのだけど、

992 :デフォルトの名無しさん :2022/12/30(金) 13:33:22.64 ID:DPUEZfMS0.net
後々の事考えて設計出来ない奴はPGに向いてない

993 :デフォルトの名無しさん :2022/12/30(金) 14:02:10.34 ID:p0azBXIn0.net
自分はできるPGですと自己申告する>>992……
その自身がどこから来るのかは誰も知らない……

994 :デフォルトの名無しさん :2022/12/30(金) 14:11:57.62 ID:DPUEZfMS0.net
そんなこと思ってない
いままで見てきた汚いソース書いている連中の総意点を述べているだけのこと

995 :デフォルトの名無しさん :2022/12/30(金) 14:28:22.93 ID:p0azBXIn0.net
つまりstd名前空間のソースは汚いから
予防のためにstd名前空間への勝手要素追加は未定義動作とするのがstdを設計したPGの立場では当然だと、

996 :デフォルトの名無しさん :2022/12/30(金) 14:33:46.74 ID:DPUEZfMS0.net
バカなの?
なんのための名前空間なのかよく考えろよ
設計を区分するためだろ
そこにお前みたいなワケワケな奴が落書きしたらめちゃくちゃになるだろ

997 :デフォルトの名無しさん :2022/12/30(金) 15:06:36.37 ID:uGEPy//I0.net
stackoverflow 辺りで
皆さんの御意見を聞いて来いよw

998 :デフォルトの名無しさん :2022/12/30(金) 17:36:57.79 ID:oiKCiiXa0.net
後のこと考えて設計するよりも先に手が動くような人じゃないとプログラミングは上達しないよ

999 :デフォルトの名無しさん :2022/12/30(金) 17:55:02.39 ID:12nE7t5Ga.net
>>998
もうお前の尻拭いするの嫌だよ
たのむから手動かす前に3分くらい考えてくれ

1000 :デフォルトの名無しさん :2022/12/30(金) 18:20:10.37 ID:2kXrfTwwd.net
昔はさ、ウォーターフォールといって
完璧な設計ができるまでコードに手を出すな
設計が決まったら黙ってそれに従うコードを書け
なんてのがあったけど
前例のないものの完璧な設計なんてほいっとできるのか
現場からのフィードバックを無視なんてできるのか
って反省から今時の方法論ができているわけで

ただし、それを悪用するだけの寄生虫を擁護はしない

1001 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1001
307 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★