!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
探検
C++相談室 part162
■ このスレッドは過去ログ倉庫に格納されています
1sage (ワッチョイ fbf0-ofdD)
2022/10/31(月) 14:29:35.57ID:J5sgTSch0621デフォルトの名無しさん (ワッチョイ 477c-eoXr)
2022/12/10(土) 21:23:07.71ID:QKVQj6nE0 そりゃ未定義動作だもの
鼻から悪魔が出なかっただけありがたいと思え
鼻から悪魔が出なかっただけありがたいと思え
622デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/10(土) 21:57:24.92ID:lr6mtoK80 その処理系ではconst_castはコンパイラをごまかす宣言ではなく&iというオブジェクトを作ってるんだろう
623デフォルトの名無しさん (ワッチョイ a769-3TNT)
2022/12/10(土) 22:07:20.11ID:qktiUlCS0 コンパイル時にiが1に置き換えられてるだけだろう
624デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/10(土) 22:23:55.76ID:lr6mtoK80 それだけじゃ&iの動作について言及が足りない感じ
625デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/10(土) 22:36:19.38ID:HtRCvZl/0 多分
const int i = 1;
を受けた最適化の結果、
std::cout<<i
が
std::cout<<1
という意味のコードになったとかじゃないの
逆アセして調べると良い
const int i = 1;
を受けた最適化の結果、
std::cout<<i
が
std::cout<<1
という意味のコードになったとかじゃないの
逆アセして調べると良い
626デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/10(土) 22:38:11.75ID:HtRCvZl/0 あるいは真にiの値を見たいのなら
...(前半は同じ)...
auto *p = (volatile int*)&i;
cout << i << " " << j << endl;
みたいにするとか?
※ 個人の感想です
...(前半は同じ)...
auto *p = (volatile int*)&i;
cout << i << " " << j << endl;
みたいにするとか?
※ 個人の感想です
627デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/10(土) 22:38:50.72ID:HtRCvZl/0 まつがえたorz
あるいは真にiの値を見たいのなら
...(前半は同じ)...
auto *p = (volatile int*)&i;
cout << *p << " " << j << endl;
みたいにするとか?
※ 個人の感想です
あるいは真にiの値を見たいのなら
...(前半は同じ)...
auto *p = (volatile int*)&i;
cout << *p << " " << j << endl;
みたいにするとか?
※ 個人の感想です
628デフォルトの名無しさん (ワッチョイ 477c-eoXr)
2022/12/10(土) 23:00:40.51ID:QKVQj6nE0 未定義動作をどうしようとコンパイラの自由なんだからそんなもの調べたってしょうがない
ちゃんと書けばいいだけのこと
ちゃんと書けばいいだけのこと
629デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/10(土) 23:01:50.82ID:lr6mtoK80 既に
std::cout << &i<<" "<< j<<std::endl;
により&iとjが同じ値であることは示されてる
auto *p = (volatile int*)&i;
これでも同じアドレスとして解釈されている(試した)
きっとconst_castに限らずconst領域のアドレスを解釈する時点で
ここのコンパイラは別領域を確保するんだな
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.20ID:QKVQj6nE0 そのcoutに出してるコードも含めて未定義動作なんだから出力されるゴミ文字列には何の保証も意味もないぞ
だからちゃんとやれ
だからちゃんとやれ
631デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/10(土) 23:07:19.81ID:HtRCvZl/0632デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/10(土) 23:34:26.52ID:lr6mtoK80633デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/11(日) 00:20:42.40ID:Pzj62nR+0634デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/11(日) 00:25:27.26ID:Wb0o85TW0635デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/11(日) 00:29:21.03ID:Wb0o85TW0 あーごめん>>634は取り消し
636デフォルトの名無しさん (ブーイモ MMcf-ejuF)
2022/12/11(日) 16:42:27.87ID:le6rXKgRM 未定義動作ではいおしまいは思考停止では?
コンパイラの実装を考えてみるのも面白い
コンパイラの実装を考えてみるのも面白い
637デフォルトの名無しさん (ワッチョイ 477c-eoXr)
2022/12/11(日) 17:18:36.24ID:SgVyrwp80 ゴミ捨て場の汚物の配置を面白がる趣味もいいけどそれで宇宙の真理を読み取ったとか言い出されても困るんだわ
638デフォルトの名無しさん (ワッチョイ df01-0RkQ)
2022/12/11(日) 17:28:44.13ID:B9k8N7vL0 特定のコンパイラの挙動が知りたいなら逆アセしろ
仕様が知りたいなら未定義動作
と言うだけの事だろ
仕様が知りたいなら未定義動作
と言うだけの事だろ
639デフォルトの名無しさん (ワッチョイ a701-3npV)
2022/12/11(日) 19:27:20.67ID:vt5XMNwC0 未定義踏んで、たまたま望む動作だった場合に、それを放置するのは危険すぎる
640はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT)
2022/12/11(日) 19:44:01.28ID:ftKoc+Hh0 前後の状況との組み合わせでも結果が変わったりするから短いコードで試しても
そのコンパイラでの挙動を知れたとは言えんし……。
そのコンパイラでの挙動を知れたとは言えんし……。
641デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/12(月) 02:44:59.90ID:m98xyCFn0642デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 14:55:49.27ID:P0mM9QsZM vector<string> v; の vを辞書順でソートした場合、string自体はメモリ上に
連続して並ぶが、肝心の文字列バッファは free store 上でバラバラに離れた
位置になるからキャッシュ・ミスし易くなるね。
stroustrup氏はリンクリストがキャッシュミスし易いと言って馬鹿にしていたが、
実際には動的配列(vector)でも大差は無い。
なお、リンクリストでキャッシュミスし易い典型例がソート後の全巡回ループ。
そしてその場合、vectorでもstringのようなメモリ資源ハンドルの場合は
キャッシュミスが免れない。
連続して並ぶが、肝心の文字列バッファは free store 上でバラバラに離れた
位置になるからキャッシュ・ミスし易くなるね。
stroustrup氏はリンクリストがキャッシュミスし易いと言って馬鹿にしていたが、
実際には動的配列(vector)でも大差は無い。
なお、リンクリストでキャッシュミスし易い典型例がソート後の全巡回ループ。
そしてその場合、vectorでもstringのようなメモリ資源ハンドルの場合は
キャッシュミスが免れない。
643デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:09:17.26ID:P0mM9QsZM >>642
[補足]
そもそも、C++はcopyの代わりのmoveによる高速化を自慢しているが、
それが意味を持つのはstringのようにfree storeのメモリをポインタで持っている
ようなクラスである。
このご自慢のmoveが良く効くクラスTのvector<T>をソートした場合、
free storeの本当の中味のアドレスはソートされないまま。
なので、vectorを全巡回する時には、アドレスが飛びとびになり、キャッシュミス
が起き易い。
[補足]
そもそも、C++はcopyの代わりのmoveによる高速化を自慢しているが、
それが意味を持つのはstringのようにfree storeのメモリをポインタで持っている
ようなクラスである。
このご自慢のmoveが良く効くクラスTのvector<T>をソートした場合、
free storeの本当の中味のアドレスはソートされないまま。
なので、vectorを全巡回する時には、アドレスが飛びとびになり、キャッシュミス
が起き易い。
644デフォルトの名無しさん (ワッチョイ 675f-3TNT)
2022/12/12(月) 15:14:58.58ID:b4gQwKir0 >>642 うんうん。リンクリストにするとキャッスミスし易さがもう少し悪化するね。
645デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:21:22.44ID:P0mM9QsZM >>644
この例の場合、vectorをlistに変えてもあまり悪化しない。
なぜなら、stringとその文字列バッファが近接したアドレスのfree store
上にallocateされていると期待できるから。
この例の場合、vectorをlistに変えてもあまり悪化しない。
なぜなら、stringとその文字列バッファが近接したアドレスのfree store
上にallocateされていると期待できるから。
646デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:26:03.32ID:P0mM9QsZM >>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>のソート後の全巡回でのキャッシュミス回数は、
ほぼ同じ。
[補足]
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デフォルトの名無しさん (ワッチョイ 675f-3TNT)
2022/12/12(月) 15:33:08.04ID:b4gQwKir0648デフォルトの名無しさん (スップ Sd7f-fWbS)
2022/12/12(月) 15:34:37.69ID:s9w5HO4Md 典型的な用途ではsmall-string optimizationで大部分が連続になるでしょ
リンクリストにその恩恵はない
リンクリストにその恩恵はない
649デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:37:07.44ID:P0mM9QsZM650デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:39:41.84ID:P0mM9QsZM >>649
[補足]
vector<string>をソートすると、stringの「箱」が新しく確保されてしまうので、
中身だけがmoveされるので、stringと対応する文字列バッファは「離れ離れになる」
list<string>をソートすると、stringはアドレスは全く変化せず、string同士の
リンクのされ方だけが変化するだけだから、stringと対応する文字列バッファは、
メモリー空間上でのアドレスの隣接を維持する。
[補足]
vector<string>をソートすると、stringの「箱」が新しく確保されてしまうので、
中身だけがmoveされるので、stringと対応する文字列バッファは「離れ離れになる」
list<string>をソートすると、stringはアドレスは全く変化せず、string同士の
リンクのされ方だけが変化するだけだから、stringと対応する文字列バッファは、
メモリー空間上でのアドレスの隣接を維持する。
651デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:40:54.03ID:P0mM9QsZM652デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:49:40.91ID:P0mM9QsZM >>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も全く発生せず。
[補足]
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デフォルトの名無しさん (ワッチョイ a7e6-JdnI)
2022/12/12(月) 22:25:35.59ID:1Of7Vyge0 いちいちキャッシュのことまで考えて書いたことなんかないですねえ
654デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/12(月) 22:29:51.34ID:EC98/b6s0 天才ですから
655デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/12(月) 22:53:10.09ID:m98xyCFn0 ソート済みならソートの利点を生かしたデータアクセスが主だろうからなあ
まあ最悪値を考えるかアベレージを考えるかはプログラム次第か
まあ最悪値を考えるかアベレージを考えるかはプログラム次第か
656デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/12(月) 23:33:02.97ID:OmhP4qQH0 キャッシュミスが起きるとか
キャッシュに収まりきらない要素数のリンクリストを
全要素まんべんなくアクセスし続ける場合とかの話であって
そうなれば区々たるデータ構造などあんま意味を成さなさげ
キャッシュに収まりきらない要素数のリンクリストを
全要素まんべんなくアクセスし続ける場合とかの話であって
そうなれば区々たるデータ構造などあんま意味を成さなさげ
657デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 06:29:45.20ID:RVT68Vp10 >>656
だからお前のコードは遅いんだな
だからお前のコードは遅いんだな
658デフォルトの名無しさん (ワッチョイ dfad-KKgq)
2022/12/13(火) 07:27:28.93ID:XemHbbXi0 配列とハッシュの話を蒸し返すけど、キャッシュに退避したデータを取り出す仕組みはハッシュなので、配列も無意識・無自覚のハッシュといえる
659デフォルトの名無しさん (ワッチョイ 7fcf-FUlb)
2022/12/13(火) 07:49:45.53ID:HbzfEbfW0 トホホw
660デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/13(火) 09:16:15.65ID:Dz/G0kAxd プログラムのフェッチもハッシュ、ライトもハッシュ、全てはハッシュに収束するのだ
661デフォルトの名無しさん (ワッチョイ dfad-KKgq)
2022/12/13(火) 09:37:04.67ID:XemHbbXi0 ありていにいえば、他のレイヤーのデータを参照する時にハッシュを使わないと処理速度が落ちてしまうので、いたるところに速度対策でハッシュ参照が実装されているってのがFA
662デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 09:54:38.28ID:6kCyUqZEd 仮にunordered_vectorなるものがあったにしても、それはハッシュではない
663デフォルトの名無しさん (スップ Sd7f-fWbS)
2022/12/13(火) 10:16:13.34ID:3/h11tyKd それunordered_setじゃね
664デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 10:32:20.10ID:nLXwCo+B0 vectorはそもそもunorderdだろ
setは同じ値を格納できないのだからvectorとは違う
setは同じ値を格納できないのだからvectorとは違う
665デフォルトの名無しさん (ブーイモ MMff-ejuF)
2022/12/13(火) 11:27:12.09ID:qMfL3xzXM 全文字列を結合したものを一括で確保して string_view を操作するのが1番パフォーマンス良さそう
666デフォルトの名無しさん (ワッチョイ dfad-KKgq)
2022/12/13(火) 11:41:42.04ID:XemHbbXi0667デフォルトの名無しさん (アウアウウー Sa6b-SJNI)
2022/12/13(火) 11:47:57.08ID:QcbajiAMa668デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/13(火) 12:02:52.82ID:RxDW3iqvd パフォーマンスを気にする人は何を使うんでしょうか
669デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 12:10:16.41ID:6kCyUqZEd670デフォルトの名無しさん (アウアウアー Sa4f-PRdN)
2022/12/13(火) 14:54:36.88ID:56FF6Qc2a >>669
え?w
え?w
671デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 16:20:37.61ID:6kCyUqZEd >>670
vectorがunorderedとが頭おかしいのかって
vectorがunorderedとが頭おかしいのかって
672デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/13(火) 16:36:06.63ID:RxDW3iqvd えっ???
673デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 16:50:01.90ID:nLXwCo+B0 >>669
c++のunorderd_は挿入時に挿入要素のキーによるソートが行われず要素の格納順が実装依存なコレクションに付けられている名称だから、vectorがunoreded_かどうかと言えばyesじゃない?
c++のunorderd_は挿入時に挿入要素のキーによるソートが行われず要素の格納順が実装依存なコレクションに付けられている名称だから、vectorがunoreded_かどうかと言えばyesじゃない?
674デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/13(火) 16:51:40.89ID:Dz/G0kAxd vectorがorder性持ってたら逆に困る
675デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/13(火) 17:09:14.84ID:Dz/G0kAxd intkeyのorderedmapってことか
676デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 17:26:33.26ID:nLXwCo+B0677デフォルトの名無しさん (ワッチョイ c75f-8x1f)
2022/12/13(火) 17:27:23.47ID:qOIMmk+U0 ランダムアクセスできるデータ構造でordered_だのunordered_だの定義してもこじつけでしかないし意味薄いんでは
678デフォルトの名無しさん (ワッチョイ 2724-xt4T)
2022/12/13(火) 18:15:32.74ID:afkUacc60 てす
679デフォルトの名無しさん (アウアウウー Sa6b-0RkQ)
2022/12/13(火) 18:20:36.37ID:7X0MJm0+a そんな事を言い出したらページアウトされてるデータの読出しになるかもしれないからディスクアクセスかもしれないだろ
680デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 18:25:37.11ID:6kCyUqZEd >>673
格納順を定義しろ
格納順を定義しろ
681デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 18:29:09.49ID:6kCyUqZEd ふざけたオレ定義はトコトン馬鹿にしてやんよ
682デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 18:32:26.52ID:nLXwCo+B0 >>680
iterator でたどれる順番
iterator でたどれる順番
683デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 18:35:45.77ID:nLXwCo+B0 >>680
ところでこの話の発端のhashでないunorderd vector ってどんなものをイメージしてたの?
ところでこの話の発端のhashでないunorderd vector ってどんなものをイメージしてたの?
684デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 18:46:51.67ID:RVT68Vp10 >>681
まずはお前の定義を書け
まずはお前の定義を書け
685デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 18:50:59.76ID:6kCyUqZEd >>682
今、屋台で酒飲んでるから後でな
今、屋台で酒飲んでるから後でな
686デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/13(火) 18:55:09.41ID:c7PbDuSHM687デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 19:04:10.54ID:nLXwCo+B0688デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 19:20:14.84ID:RVT68Vp10 ordered_配列 ==> 勝手に中身がソートされる配列
が思い浮かぶ
が思い浮かぶ
689デフォルトの名無しさん (ブーイモ MM8f-5DNi)
2022/12/13(火) 19:23:38.37ID:LOsLj3+sM >>688
std::multiset なんてのがあるんだな
std::multiset なんてのがあるんだな
690デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/13(火) 19:24:14.15ID:jWNvO27sM そもそも、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が存在し無い。
また、故意に作ってもしょうがない。
まず、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.60ID:RVT68Vp10 ordered, unordered
が書けないヤツが多すぎ問題
が書けないヤツが多すぎ問題
692デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 19:27:00.39ID:RVT68Vp10 実は全部同じ人?
693デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/13(火) 19:28:42.74ID:jWNvO27sM >>688
それが大体、「set」や「multiset」に相当する。
それが大体、「set」や「multiset」に相当する。
694デフォルトの名無しさん (ワッチョイ 675f-k8RX)
2022/12/13(火) 19:28:56.13ID:sAeHrnUZ0 巡回機能って何
695デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/13(火) 19:37:41.71ID:jWNvO27sM >>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";
}
と等価だと思う。
ただし、一度も使ったことが無い。
まだ使ったことが無いので書き方が間違ってるかも知れないが、
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デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 20:16:44.72ID:RVT68Vp10697デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 21:45:11.86ID:FUi24cxt0 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;
}
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デフォルトの名無しさん (ワッチョイ c75f-jpzT)
2022/12/13(火) 22:04:34.09ID:qOIMmk+U0 >>697
C++20でキャプチャ指定のないラムダ式がデフォルトコンストラクタを持つようになったからかな
https://ja.cppreference.com/w/cpp/language/lambda
C++20でキャプチャ指定のないラムダ式がデフォルトコンストラクタを持つようになったからかな
https://ja.cppreference.com/w/cpp/language/lambda
699デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 22:11:52.14ID:FUi24cxt0 >>698
なるほどー!
なるほどー!
700デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 22:27:14.40ID:FUi24cxt0 納得しちゃダメだった
ラムダ式の型は実装ごとに異なるみたいですね
以下__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}
ラムダ式の型は実装ごとに異なるみたいですね
以下__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デフォルトの名無しさん (ワッチョイ 675f-3TNT)
2022/12/13(火) 23:32:00.27ID:vjOTFb3s0 >>697
> m1にはcomparatorの型しか情報を渡しておらず
> m1は実装に関しては何も知らないはずなのですが
ここが思い込みかと。
ラムダ式のクラス型に比較関数が含まれてて、その内容もインスタンスに依存しないし、
比較方法は十分伝わってるから問題ないということで何も不思議じゃないと思う。
> m1にはcomparatorの型しか情報を渡しておらず
> m1は実装に関しては何も知らないはずなのですが
ここが思い込みかと。
ラムダ式のクラス型に比較関数が含まれてて、その内容もインスタンスに依存しないし、
比較方法は十分伝わってるから問題ないということで何も不思議じゃないと思う。
702デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 23:43:34.19ID:FUi24cxt0703デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 23:48:00.37ID:FUi24cxt0 関数ポインタと書きましたが
関数オブジェクトとの相似で考えると不思議じゃないですね
関数オブジェクトも型で実装の情報を渡しますから
失礼しました
関数オブジェクトとの相似で考えると不思議じゃないですね
関数オブジェクトも型で実装の情報を渡しますから
失礼しました
704デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/14(水) 08:35:41.62ID:YVPbaJHSM >>687
c++のunorderd_/(ordered_)は要素をキーにしてコレクションがソート済みになるかどうかを意味してると考えれば
全然違うよ。標準くらい読みなよ。
Associative containersとUnordered associative containerの本質的な違いはキーの定義。
Associative containersのキーは順序で比較可能でなくてはならず、Unordered associative containerは同値で判定可能でなくてはならない。
ついでに言うと、配列は(記憶に間違いなければ)直接メモリ番地で指定できなきゃならなくて、キー(みたいなもの)も(正)整数でなくてはならなかったはず。
c++のunorderd_/(ordered_)は要素をキーにしてコレクションがソート済みになるかどうかを意味してると考えれば
全然違うよ。標準くらい読みなよ。
Associative containersとUnordered associative containerの本質的な違いはキーの定義。
Associative containersのキーは順序で比較可能でなくてはならず、Unordered associative containerは同値で判定可能でなくてはならない。
ついでに言うと、配列は(記憶に間違いなければ)直接メモリ番地で指定できなきゃならなくて、キー(みたいなもの)も(正)整数でなくてはならなかったはず。
705デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 08:45:51.73ID:MH9vv9Il0 配列の添字がキーだと思ってる人と
配列の中身がキーだと思ってる人
とじゃ会話が成り立たない
実際はどちらもキーではない
配列の中身がキーだと思ってる人
とじゃ会話が成り立たない
実際はどちらもキーではない
706デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/14(水) 09:11:41.03ID:F4iAWC8Wd ねえパパ、バカって何?
簡単なことを難しく言う人のことだよ
う~ん、よくわかんないや
簡単なことを難しく言う人のことだよ
う~ん、よくわかんないや
707デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/14(水) 09:19:31.03ID:0zkFeBrgd 標準の話をするならvectorは連想配列じゃないしorderとか考えるものでもない
708デフォルトの名無しさん (アウアウウー Sa6b-SJNI)
2022/12/14(水) 09:39:28.51ID:iS/QLVofa vectorで添字アクセスするのはなんか違う
709デフォルトの名無しさん (テテンテンテン MM8f-PRdN)
2022/12/14(水) 09:55:06.54ID:fk0KXlHdM >>同値で判定可能
同値「かどうか」判定可能じゃないの?
>>配列は直接メモリ番地で〜
意味不明
同値「かどうか」判定可能じゃないの?
>>配列は直接メモリ番地で〜
意味不明
710デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 10:35:37.85ID:Y6rgBuPWd 定義もせずに真偽を議論しようとするアホ
711デフォルトの名無しさん (ワッチョイ 479c-0RkQ)
2022/12/14(水) 11:33:30.37ID:ZSc/wamY0 >>709
>同値「かどうか」判定可能じゃないの?
意味不明。
厳密に言うなら、Unordered associative containerが要求しているのはa == b a != b。
同値「かどうか」とか曖昧な突っ込みで何やりたいの?
>同値「かどうか」判定可能じゃないの?
意味不明。
厳密に言うなら、Unordered associative containerが要求しているのはa == b a != b。
同値「かどうか」とか曖昧な突っ込みで何やりたいの?
712デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/14(水) 12:05:38.08ID:apgWSyiy0 >>704
なるほどだいたい理解した
つまり最初の話に戻るなら unordered_multivector というものを考えた場合、格納する要素を a == b と a != b が定義されているものに限定して、
最悪の実装を考えると要素の格納方法は vector そのもので良くて要素のサーチは先頭からリニアに a == b をチェックしていくことになり、
unordered_vector ならば要素格納時に a == b なものを除外すればよいというわけだね
なるほどだいたい理解した
つまり最初の話に戻るなら unordered_multivector というものを考えた場合、格納する要素を a == b と a != b が定義されているものに限定して、
最悪の実装を考えると要素の格納方法は vector そのもので良くて要素のサーチは先頭からリニアに a == b をチェックしていくことになり、
unordered_vector ならば要素格納時に a == b なものを除外すればよいというわけだね
713デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 12:13:00.02ID:Y6rgBuPWd (使い所が無い)新たなコンテナを考えるスレじゃないと思う
当然Perlのスレでもない
当然Perlのスレでもない
714デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 12:23:38.93ID:Y6rgBuPWd C++の配列がordered, unorderedどちらの分類に近いかなら
キーが配列の添字 ==> ordered
キーが配列の中身 ==> unordered
キーが配列の添字 ==> ordered
キーが配列の中身 ==> unordered
715デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 12:29:53.77ID:Y6rgBuPWd716デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/14(水) 12:39:11.82ID:14xvhmEyM >>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とか考えても意味がない。混乱の元だからやめたほうがいい。
>>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デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 13:40:10.14ID:Y6rgBuPWd setはキーも中身も同じ
718デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/14(水) 13:44:24.99ID:F4iAWC8Wd ハッシュの配列はハッシュではない
719デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 13:52:25.03ID:Y6rgBuPWd720デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/14(水) 14:28:12.41ID:0zkFeBrgd vectorにinsertがある
添字はkeyではなくindexでしかない
何にとってorderedであるかはプログラマーに委ねられている
添字はkeyではなくindexでしかない
何にとってorderedであるかはプログラマーに委ねられている
721デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 16:26:53.57ID:Y6rgBuPWd 訂正
vectorの添字はuniqueでordered
vectorの中身はmultiでunordered
vectorの添字はuniqueでordered
vectorの中身はmultiでunordered
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 東京株式市場 インバウンド関連株が下落 中国政府の渡航自粛要請で [バイト歴50年★]
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 戦争は無くならないし殺人は起きるし女はレイプされるし子供は餓死するし
- 女性検診なんでオナニーしてグチョグチョで行ってやる
- 日経時間外、5万円割れ 垂直落下始まる [402859164]
- ( ´・ω・` )朝ですぞー
- 【悲報】男性人気アイドルグループJO1、中国公演中止wwwwwwwwwwwwwwwwwwwwwwwwwww
