C++相談室 part154 at TECH
[2ch|▼Menu]
[前50を表示]
650:デフォルトの名無しさん
21/02/08 21:15:43.14 NGjwD54G.net
shared_ptr(またはスマポ)至上主義の変なやつ以前から居るんだよな
相手にするな

651:デフォルトの名無しさん
21/02/08 21:37:27.20 UsSsiWeS.net
ナマポ使ったほうが良い場面なんて皆無でしょう

652:デフォルトの名無しさん
21/02/08 21:48:31.75 2GJiXyxS.net
出たwナマポ完全否定奴w

653:デフォルトの名無しさん
21/02/08 21:58:57.06 VJ9lplXi.net
参照型のメンバ変数は参照オブジェクトの生存期間を保証できないからweak_ptrで保存しておいて使う時だけshared_ptrを取得するのがC++的な解決なんじゃないの。

654:デフォルトの名無しさん
21/02/08 22:08:09.48 FKp3giDs.net
スマポにしたら所有権の問題を考えなくてよい
というわけではないからスマポ使えというのは妥当ではない
逆に所有権に矛盾が無ければインスタンスは生成元が与えた参照を持って良い
ていうかスコープを抜けたら自動的に解放される系のクラスを書いたら
エラー処理上エラー通知先としての生成元オブジェクトの参照保持はほとんど不可避

655:デフォルトの名無しさん
21/02/08 22:11:14.29 NgGwlfwa.net
コピー禁止のshared_ptr欲しい

656:デフォルトの名無しさん
21/02/08 22:25:23.27 bp+4mh0R.net
すべてスマポで書くスタイルも悪くないと思うけど、メイヤーズ神もツリー構造で子が親のポインタを持つときはナマポで十分と書いている

657:デフォルトの名無しさん
21/02/08 22:27:43.60 34Jom8HU.net
木のノードは子へのポインタじゃなくて子のノードIDを持て😡

658:デフォルトの名無しさん
21/02/08 22:48:15.38 NgGwlfwa.net
自分よりポインタの方が寿命が長いことが保証されているなら確かに生ポで問題ないが
それが成り立つ状況ってなかなかないよな。

659:デフォルトの名無しさん
21/02/08 23:02:19.81 VJ9lplXi.net
参照先の実体がまだ生存しているかどうか知るにはweak_ptr::expired()を使うしかないのが現状でしょ。

660:デフォルトの名無しさん
21/02/08 23:07:56.19 nKLqWVxG.net
Chromiumはstd::unique_ptrを全面的に使ってるけど、ポインタを使う設計そのものが古いような気がする。

661:デフォルトの名無しさん
21/02/08 23:13:28.50 BwguerZK.net
まあcコードを全く使わないってのならいいんでないの。
ただc++のポータビリティーは君が思ってるより低いけどね。

662:デフォルトの名無しさん
21/02/08 23:23:15.47 cR8ppl+C.net
露骨すぎるマウント取りたがりダッセーwww

663:デフォルトの名無しさん
21/02/09 01:58:29.04 qUmf+U4D.net
マウントじゃなくてポインタでは?

664:デフォルトの名無しさん
21/02/09 02:46:23.52 jPnyP+Vp.net
C++に特化したAPIなんてどこのOSでも提供されないから、結局、Cの配列と互換性のあるstd::vectorやstd::arrayを使わざるを得なくなる。

665:デフォルトの名無しさん
21/02/09 04:01:45.22 qUmf+U4D.net
>>644
木もコンテナで良いですよね。
所有権がハッキリしてて。

666:デフォルトの名無しさん
21/02/09 07:34:27.86 nSJhwzEU.net
>>651
data()を必ず使う手合いか?

667:デフォルトの名無しさん
21/02/09 07:39:10.06 s3p3GZ7R.net
木は木全体を収める領域ごと一気に解放する場合もあるから別に

668:デフォルトの名無しさん
21/02/09 17:49:12.66 KrtnTLUi.net
>Cの配列と互換性のある
doubt

669:デフォルトの名無しさん
21/02/09 17:53:30.91 LEWRJrN2.net
ダウトとデビューって似てるよね

670:デフォルトの名無しさん
21/02/09 18:35:55.16 qUmf+U4D.net
親が子のポインタを所有する木は、親を消すとネストして子孫のデストラクタを呼ぶので、スタックが枯渇します。
したがって、子から順番に消さなくてはなりません。

671:デフォルトの名無しさん
21/02/09 18:56:53.48 qUmf+U4D.net
その様はまるで摩天楼がドミノ倒しのように連鎖倒壊するようでもあり、DOMINOというピザにもなっています・

672:デフォルトの名無しさん
21/02/09 19:07:16.84 IPYpL0sA.net
なんと後味の悪い話

673:デフォルトの名無しさん
21/02/09 20:39:36.84 zHOwdh/n.net
意味が分からない

674:デフォルトの名無しさん
21/02/09 21:07:48.14 Rh87rJZX.net
>>657
それで枯渇するようじゃ木の探索すらできない。

675:デフォルトの名無しさん
21/02/09 21:13:02.23 5Ac7csWH.net
探索はループでもできるんで、たとえば数万個の要素を持つツリーを子から消せというのは真理なのかも

676:デフォルトの名無しさん
21/02/09 21:27:40.55 AojZLEiV.net
消すのは独立して実行できるので別スレッドに送れば実質コスト0

677:デフォルトの名無しさん
21/02/09 21:38:09.75 s3p3GZ7R.net
>>662
DFAとPDAではやれることの範囲の違いがちげう
つかこの場合は安易にスマポとかコンテナを使うから破棄ごときにトラバースの手間がかかるんである

678:デフォルトの名無しさん
21/02/09 21:44:42.72 5Ac7csWH.net
それもそうであるな

679:デフォルトの名無しさん
21/02/09 21:50:17.60 s3p3GZ7R.net
ちゅか垂直探索なら木をメモリに持っておく必要が無い
水平探索ならメモリ上に世代1、世代2、....と木を育てていく(らしい)が
兄弟ノードを全部見終えたのでいざ従妹ノードに移ろうとするときに
親ノードへの参照は欲しい木がするがするとshared_ptrなら即循環参照になり、
子の情報で親(子孫がいっぱいぶら下がっている)を生成できるわけもないから、
ウィークポインタの出番でもない

680:デフォルトの名無しさん
21/02/10 01:37:49.58 XIZePh+h.net
子から消さなかったばかりに。
2000人を乗せた航空機が洋上で消えた。
ってなるかも?

681:デフォルトの名無しさん
21/02/10 01:48:13.89 ZYaksnCf.net
A380でさえ853席だが2000人なんてどうやって載せるんだろう

682:デフォルトの名無しさん
21/02/10 01:51:41.17 2ozOIzIF.net
く、空中で衝突するとか…

683:デフォルトの名無しさん
21/02/10 01:53:08.99 XIZePh+h.net
インドでは屋根の上にも乗ります。

684:デフォルトの名無しさん
21/02/10 01:55:11.55 XIZePh+h.net
URLリンク(trafficnews.jp)
証拠写真みつけてきた。

685:デフォルトの名無しさん
21/02/10 01:55:17.84 uF0JvJPV.net
GTA5のMOD作成者みたいな会話だな

686:デフォルトの名無しさん
21/02/10 02:01:19.54 uF0JvJPV.net
>>653
昔はdata()がなかった。(遠い目)

687:デフォルトの名無しさん
21/02/10 06:40:17.61 ZYaksnCf.net
アントノフの貨物室にすし詰めでどんくらい乗れるかな

688:デフォルトの名無しさん
21/02/10 06:40:27.16 XIZePh+h.net
東京: TK
京都: KT
大阪: OSK
淡路: AWG

689:デフォルトの名無しさん
21/02/10 07:59:22.76 FGGGEnfF.net
航空機や原発みたいなクリティカルなシステムでは
全部固定長の配列で書いてあるんじゃないの

690:デフォルトの名無しさん
21/02/10 08:06:21.27 uF0JvJPV.net
釣れますか。
ヒープのほうが少し安全です。

691:デフォルトの名無しさん
21/02/10 10:25:11.13 4XPmMtZj.net
>>671
どこが証拠やねん!
せいぜり100人やないかヽ(`Д´)ノ

692:デフォルトの名無しさん
21/02/10 14:32:04.65 TFzLuCg0.net
すみません、std::for_each を使っていて continue したくなりましたが、サポートしてないです
よね? これって:
1. for_each は continue する必要がないような処理に限ってに使うべき。
2. ループの中で大きい if ブロックを作って空の処理にすればよい。
3. その他

693:デフォルトの名無しさん
21/02/10 15:13:45.18 ZYaksnCf.net
returnすれば?
for_each(begin(foo), end(foo), []{ if(bar) return; });

694:デフォルトの名無しさん
21/02/10 16:06:00.49 HSfvjOUE.net
return は continue ではなく break じゃないの?
質問者の2.大きなif分で実質何もしないでいいと思う

695:デフォルトの名無しさん
21/02/10 16:20:11.24 ZYaksnCf.net
for_eachをbreakするにはthrowかlongjmpがいるぞ

696:デフォルトの名無しさん
21/02/10 16:35:39.62 S47HOUGT.net
きったねぇジャンプだ

697:デフォルトの名無しさん
21/02/10 16:51:31.94 HSfvjOUE.net
あ、ラムダ式になってたのか

698:はちみつ餃子
21/02/10 17:51:08.81 tNqysU9n.net
>>679
for 文で書いた方が短く書けそうだけど、
あえて for_each を使いたい理由が何かあったりするの?

699:デフォルトの名無しさん
21/02/10 18:41:41.17 FGGGEnfF.net
Perlなら問題無くできる(continue→next、だが
C++規格委員会がfor_eachのcontinueを許可しないのは最後の一線なのかもしれん…

700:デフォルトの名無しさん
21/02/10 19:51:57.06 teDb7k99.net
何の一線よ

701:デフォルトの名無しさん
21/02/10 20:18:41.39 ln/pLvjf.net
いやreturnでいいだろ…
許可しないってなんのことだよ

702:デフォルトの名無しさん
21/02/10 21:21:18.68 +e+FbMSY.net
vectorで一億件ほどで、飛ばしたいのが100〜1000件程度なんだろう

703:デフォルトの名無しさん
21/02/10 21:51:25.56 QYfnOwKH.net
>>679
for_eachをrange based forに変更は出来ないの?

704:デフォルトの名無しさん
21/02/10 21:59:01.21 ZYaksnCf.net
>>690
おまえのスキルのためにか?

705:デフォルトの名無しさん
21/02/10 22:17:23.69 qtVJ0qYe.net
range based forなら普通にcontinueできるぞ

706:デフォルトの名無しさん
21/02/10 22:18:26.21 ln/pLvjf.net
>>689
飛ばす手段があったとして、飛ばすかどうかどこでどう判断するの?

707:デフォルトの名無しさん
21/02/11 04:16:42.30 nrDdTgaQ.net
early returnは正義

708:デフォルトの名無しさん
21/02/11 11:22:44.35 n0GRjtoR.net
>>685
テンプレのときとか

709:デフォルトの名無しさん
21/02/11 17:53:02.68 Iq2aKjep.net
679がなぜfor_eachを使うのかを無視するのは
他人の領分を侵すお節介だ
for_eachの使い方をアドバイスできんやつは
しゃしゃり出てくるな

710:デフォルトの名無しさん
21/02/11 18:00:13.22 hRfccug1.net
よくよく話を聞いてみたらまるで異なる解決策が見つかるなんてよくあることじゃん。そんな経験ないの?
何をしたかったか確認するのは重要

711:デフォルトの名無しさん
21/02/11 18:15:41.21 Iq2aKjep.net
流れをよく読んでみろよ
for_eachをロクに使ってないやつなのモロバレだろ
質問者が尋ねていないことを答えたいから協力しろなんてぬかすのは
回答者の資格ねえんだよ

712:デフォルトの名無しさん
21/02/11 18:18:25.32 Iq2aKjep.net
自分が何か尋ねているときに
質問内容に付き合ってやれる懐のねえやつは
うぜえだけだろが

713:デフォルトの名無しさん
21/02/11 18:23:57.31 Iq2aKjep.net
質問内容において自分より下なやつに教えを請いたいかよ

714:デフォルトの名無しさん
21/02/11 18:34:11.92 hRfccug1.net
for_eachを使う場合の答えはとっくに出てるのに何言ってんの?

715:デフォルトの名無しさん
21/02/11 19:17:08.97 15xoUz1R.net
3のその他で答えただけ。

716:デフォルトの名無しさん
21/02/11 20:01:29.92 veopzNW6.net
他人の領分なんて侵してナンボ

717:デフォルトの名無しさん
21/02/11 20:03:18.37 qccRsQET.net
>>702
はあ?returnではいけない理由は?

718:デフォルトの名無しさん
21/02/11 20:19:00.69 a/CQbB/Z.net
>>679はループしたいだけだろ
std::for_eachを何が何でも使わなければならない特殊な事情があるなら仕方ないけどそんなこと言ってないし

719:デフォルトの名無しさん
21/02/11 20:23:31.36 nDjPJyoP.net
>>704
returnで良いと思うよ。

720:デフォルトの名無しさん
21/02/11 20:50:06.93 Iq2aKjep.net
>>701
680は俺だが何言ってんの?

721:デフォルトの名無しさん
21/02/11 21:58:36.08 bviF/sLG.net
Visual Studio 2010(MSVC2010)で
 template<class T>
 void foo(T x) {
  printf("%d: %d\n", targetEntity, x);
 }
という関数テンプレートが定義されているときに、
 namespace bar { const int targetEntity = 1; }
 using bar::targetEntity;
 void baz() { foo(100); }
はコンパイルが通るのに、
 namespace bar { const int targetEntity = 1; }
 void baz() {
  using bar::targetEntity;
  foo(100);
 }
だと
 error C2065: 'targetEntity': 定義されていない識別子です。
と言われるorz

722:デフォルトの名無しさん
21/02/11 22:06:56.76 bviF/sLG.net
>>688
for_eachを勘違いいてたわサーセン、
確かにfor_each<bgn, end, Function>のFunction(*it)からならreturnするで良さげ

723:デフォルトの名無しさん
21/02/11 23:28:48.49 Ooe4jkn9.net
>>707
アンパンマンはキミだ。

724:はちみつ餃子
21/02/12 01:36:02.90 2OOQ6m86.net
>>708
宣言の有効範囲は宣言された場所からその宣言を含むブロックの終わりまでというのが原則
(クラススコープなどの例外はあるのでその他にも関連するルールはあるかもしれんけど)
なのでどちらもエラーになるのが筋だと思うし、 gcc や clang で試したらどっちもエラーだった。
逆にどういう理屈で前者が通るのかは気になる。

725:デフォルトの名無しさん
21/02/12 06:02:20.64 45Tu3B4L.net
>>708
当たり前だね
最初の例ではtargetEntryをグローバル空間に導入しているからbaz()とfoo()の両方から見える
2番目の例ではtargetEntryをbaz()のブロック内に導入しているから、そこに包含されないfoo()のブロックからは見えない
ただし、これはfoo()を関数原型と関数定義に分けて関数定義をbarよりも後方に置いた場合の話だ
原文のままでは>>711が言うとおり通るわけがない

726:デフォルトの名無しさん
21/02/12 06:03:16.30 45Tu3B4L.net
- barよりも後方
+ usingよりも後方

727:デフォルトの名無しさん
21/02/12 07:01:12.63 3x5iWh5q.net
確かにideoneでもVS2019でも両方エラーになるのですだが、
1番目の例はVS2010ではビルドも通って動くもーん
ソース:
URLリンク(ideone.com)
実行結果(※ VS2010限定):
1: 100
続行するには何かキーを押してください . . .

728:デフォルトの名無しさん
21/02/12 07:04:11.00 3x5iWh5q.net
ちな関数テンプレートfoo()の定義をusingよりも後方にしたら全てでビルドが通って動く
まそりゃーそうならないとおかしいが

729:デフォルトの名無しさん
21/02/12 07:12:42.48 45Tu3B4L.net
>>714
通ってねえじゃん
何が言いたいんだ?

730:デフォルトの名無しさん
21/02/12 07:17:08.75 3x5iWh5q.net
>>716
> >>714
> 通ってねえじゃん
> 何が言いたいんだ?
※ VS2010限定

731:デフォルトの名無しさん
21/02/12 07:24:49


732:.77 ID:45Tu3B4L.net



733:デフォルトの名無しさん
21/02/12 07:27:26.57 3x5iWh5q.net
全員の主張を再検証しただけでつよ?
>原文のままでは>>711が言うとおり通るわけがない (>>712)
が覆されてご機嫌ななめ??

734:デフォルトの名無しさん
21/02/12 07:32:07.63 45Tu3B4L.net
覆った?
おまえVS2010限定で逃げただろ
ill-formedはill-formed
これを覆せたら出直して来な

735:デフォルトの名無しさん
21/02/12 07:34:53.80 45Tu3B4L.net
俺も昔のバージョンのコンパイラは使うがバグ技は使わないし
そういうことをする厨二病とは組みたくない

736:デフォルトの名無しさん
21/02/12 07:38:38.54 3x5iWh5q.net
>おまえVS2010限定で逃げただろ
VS2010ではビルドが通るというのが話の発端なので…
1番目の例がill-formedであろう点は同意

737:デフォルトの名無しさん
21/02/12 07:51:23.22 45Tu3B4L.net
orzなんだろ
何が誰が悪いのかわかったら素直になれよ
居直る態度が気に入らねえ

738:デフォルトの名無しさん
21/02/12 08:12:22.74 3x5iWh5q.net
何が悪いのか、はともかく
誰が悪いのかとは一体…
つか現象(事実)の提示に対してそれを反発と解釈して勝手に炎上しないでいただきたい;;;
個人的にはVS2010のバグである可能性でほぼ確定とは思いつつ、
例1と例2で動きが違うことから、MSVC2010は、グローバルなシンボルについて
template foo()や関数baz()の中の解釈に入る前に名前空間を確定させる実装なのだと感じる
(template foo()の解釈ロジック自体にバグがあるなら例1、2とも同じ結果になるのが自然
再発防止のためには、C++規格のどこをどう読めば良いんじゃorz

739:デフォルトの名無しさん
21/02/12 08:57:55.62 45Tu3B4L.net
>>719は明らかに煽り口調だろうが
和解したいなら、あの態度を撤回しろ
俺は和解なんかできなくて構わんが

740:デフォルトの名無しさん
21/02/12 10:26:37.15 1W1GlA05.net
匿名掲示板で誰が何を言ったのどうのとみっともないぞデフォルトの名無しさんよ

741:デフォルトの名無しさん
21/02/12 11:29:35.12 jxDcSv/l.net
どう見ても>>716がイミフな言いがかりつけてるだけにしか見えんが…
> 確かにideoneでもVS2019でも両方エラーになるのですだが、
> 1番目の例はVS2010ではビルドも通って動くもーん

742:デフォルトの名無しさん
21/02/12 13:22:44.45 x9NfpsA7.net
匿名でも江副とかQZとか片山やはちみつが糞なのは伝わってくるω

743:デフォルトの名無しさん
21/02/12 18:24:14.30 45Tu3B4L.net
単発IDになりやがった
どこまでも腐ってやがるな

744:蟻人間
21/02/12 19:12:56.39 fTOQtm+W.net
どこでも動くように標準化しましょうねって話だよね。

745:蟻人間
21/02/12 19:29:19.43 WC9JZZt5.net
G++とかclang++などの複数のコンパイラで警告最大にして自動ビルドすれば再発防止できると思われます。

746:デフォルトの名無しさん
21/02/12 19:37:54.63 3abO7oQ0.net
流れをぶった切って質問です。
あるクラスで生成、削除を一切合切プライベートにしたい(ファクトリメソッドでスマートポインタを渡す)んだけど、
::deleteを対象クラスだけプライベート、あるいはコンパイルエラーにする
ことって可能かしらん?

747:蟻人間
21/02/12 19:46:11.11 WC9JZZt5.net
>>732
private dtor使え、だとよ。
URLリンク(stackoverflow.com)

748:蟻人間
21/02/12 19:55:37.68 fTOQtm+W.net
dtorはデストラクターの略ね。
死のトラクターじゃないよ。

749:デフォルトの名無しさん
21/02/13 02:57:21.77 ZCgeuP6g.net
映画化決定。

750:
21/02/15 00:20:32.87 M7Hs01/T.net
>>728
私が馬鹿なのは私自身が認めていることですが、片山さんはすごいと思いますよ、何よりも片山さんは多産ですし、私は片山さんを尊敬しています‥‥

751:デフォルトの名無しさん
21/02/15 12:30:59.56 tZ1nblID.net
>>733
ありがとう。参考になりました。
流石にグローバルdtorの直接呼び出しを気にしている人は居なさそうですね。
通常の使い方じゃないから気にするな、が正解かしらん。

752:デフォルトの名無しさん
21/02/16 18:45:49.14 zTH+X1Xm.net
画像
URLリンク(genkibox.com)

753:デフォルトの名無しさん
21/02/16 18:59:33.07 zTH+X1Xm.net
つかprivate dtorって何の解決にもなって
なくね?
クラスFooのデストラがprivateな時点で
Fooのfirendでも何でもないstd::shared_ptr<Foo>はビルドエラーになる宿命なのでは…
あとp.get()->Delete()とされるのも恐ろしいすぐる………

754:デフォルトの名無しさん
21/02/16 19:15:28.82 Pme6j5oX.net
>>739
そのあたりは回避策ある。
どのwebページに解説あったか覚えてないけど……

755:デフォルトの名無しさん
21/02/17 08:24:04.17 Pn/OWNHb.net
operator <=>を定義しても
==と!=が使えるようにならないのは、なんで?

756:デフォルトの名無しさん
21/02/17 11:29:34.99 u6Au0MiC.net
URLリンク(cpprefjp.github.io)
のoperator==節で仕様とその理由についても説明してあります

757:デフォルトの名無しさん
21/02/17 12:05:07.17 8kTif7Fu.net
relops

758:デフォルトの名無しさん
21/02/17 12:07:48.78 ZhVk2C4b.net
relops

759:デフォルトの名無しさん
21/02/17 12:14:57.71 7xS0C1vs.net
なるほどわからん。弱順序って何よ?

760:デフォルトの名無しさん
21/02/17 13:36:33.88 peDNmUYI.net
>>745
二項関係で、反射律、推移律、比較可能性を満たすもの

761:
21/02/17 21:10:31.90 n4obO1jB.net
>>746
擬順序とか半順序と呼ぶ本もありますね、
ただ、その「比較可能性を満たす」とはなんでしょうか?私の教科書では、擬順序には反射律・推移律だけしか要請されていなかったと記憶しているのですが?

762:デフォルトの名無しさん
21/02/17 23:46:57.44 ZhVk2C4b.net
普通に言葉通り任意の2つの元を比較できるということなのでは…
木構造で「親は子より大きい」という順序を定義しただけ
(全順序集合(例えば整数)で全ノードをラベル付けしてしまうというチート手段に訴えことなく、
 文字通り「if (aはbの親) { a > b; }」という規則と(a, b)の反射律、推移律を導入しただけ
では兄弟間の大小が定まらない、
みたいな

763:デフォルトの名無しさん
21/02/17 23:47:32.54 ZhVk2C4b.net
のは半順序で、
整数みたいなやつが全順序

764:デフォルトの名無しさん
21/02/17 23:59:39.55 ZhVk2C4b.net
なお{ 全順序集合 }⊂{ 半順序集合 }なのは確定的に明らかなので、
反射律・推移律だけしか要請されていなかったらそれは全順序集合の集合を含む半順序集合の集合の意味となりぬ
つまり全順序集合の集合と半順序集合の集合が区別できん
両社を区別したい議論のときは比較可能性の有無を宣明せねばならんぬ、

765:デフォルトの名無しさん
21/02/18 00:34:07.44 48a8FzyN.net
a≦b または b≦aが成り立つ時、比較可能
弱順序ってしらなかったけど、半順序とは違うようだ
「半順序?弱順序?二項関係・順序関係まとめ」って記事

766:デフォルトの名無しさん
21/02/18 03:35:31.61 sRdwF113.net
束論やってるけど弱順序とか初めて聞いた…
マ界用語?

767:741
21/02/18 06:50:20.77 brZHVFLx.net
>>74


768:2 まだ何とも言えないが thx!



769:デフォルトの名無しさん
21/02/18 10:08:01.17 48a8FzyN.net
弱順序は、半順序よりは制限強いが全順序より弱いもので、
ある種のソートアルゴリズムでは全順序よりは制限緩められるけど
半順序までは緩められない、ってのがあるみたいね

770:デフォルトの名無しさん
21/02/18 13:16:30.49 9Yl3mCZH.net
>>752
束って何で勉強すればいいん?

771:デフォルトの名無しさん
21/02/18 14:43:05.98 48a8FzyN.net
アルゴリズムとの関連はちょっとわからんけど
数学としての束論って単独の本は少なくて、代数学の本に載ってるんじゃないかな
もしくは順序集合の話として集合論の本

772:
21/02/19 04:42:11.06 3tFNJrqv.net
>>748
>普通に言葉通り任意の2つの元を比較できるということなのでは…
いや、それは全順序ですよ
・擬順序
・順序
これらの演算子を≦としたとき、かならずしも任意の二元 a, b について a ≦ b の真偽が定まらなくてもいいと思います
擬順序に対して「a ≦ b かつ b ≦ a ならば a = b」という縛りが追加されるのが順序、
順序に対して、任意の二元 a, b について「a ≦ b」または「b ≦ a」のどちらかである、という縛りが要請されるのが全順序
だったかと

773:デフォルトの名無しさん
21/02/19 20:38:08.11 mpGE+xsF.net
wikipediaの「推移関係」の項目より
半順序 - 反対称的な擬順序
擬順序 - 推移的であると同時に反射的
全擬順序 - 完全的な擬順序
同値関係 - 対称的な擬順序
厳密弱順序 - 強半順序関係で等価関係での比較が不可能な場合
全順序 - 推移的で反対称的な完全関係
全順序、半順序くらいしか知らんかった

774:デフォルトの名無しさん
21/02/19 20:51:11.65 gWMDVcMR.net
OOPの本だとサブクラス関係は前順序って書いてるよな?擬順序ともいうのか
推移的、A→B∧B→C |- A→C 、サブクラスのサブクラスはサブクラス
かつ反射的、AはAのサブクラス

775:デフォルトの名無しさん
21/02/19 20:55:11.79 fAhRarpN.net
>>757
>いや、それは全順序ですよ
は? その条件が共通なだけだろ

776:
21/02/19 21:23:56.68 3tFNJrqv.net
>>760
一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいいのですよ
すべての二項間で順序の真偽が定まるのは、順序の中でも一番強いものである全順序で初めて導入される、と私は解釈しています

777:デフォルトの名無しさん
21/02/19 21:44:53.04 gWMDVcMR.net
ブール代数 型システムで検索しても出てこないけど>>523
可補分配束の定義見てると確かにそんな気はしてくる
インスタンス関係かサブクラス関係なのか?どっちでも成り立ちそうだけど、取り敢えず静的チェックをパスすることを考える
要素が無いと言う意味でCのvoidを冪集合ブール代数の最小元、空集合とみなす
void *は何でも指せるという意味で最大元
まともな型システムなら(少なくとも)上記の擬順序以上は要求る
演算は多重継承とvirtual 定義が∨/∧に対応?クラス図書いてみたら成り立ちそうに思える
型チェック通らない全ての型を考えられるし、それが¬
型述語で定義してればそのまま!演算子になる

778:デフォルトの名無しさん
21/02/19 21:55:14.25 gWMDVcMR.net
確証が持てなくてもどかしい…数学できる人ツッコミ待ち
とりあえずダイヤモンド継承を許さない言語だと、常に∧/∨は定義されないからブール代数にはならない事には気付いた

779:デフォルトの名無しさん
21/02/19 21:55:34.53 hHLb88jw.net
ググってる時点で、というかそのことを隠しもしないニワカ

780:デフォルトの名無しさん
21/02/19 21:56:36.22 gWMDVcMR.net
>>764
隠して5chなんかで偉ぶってどうすんのさ

781:デフォルトの名無しさん
21/02/19 22:01:35.27 aORwmd7L.net
質問ですがムーブコンストラクタを有する基底クラスの
派生クラスでムーブコンストラクタを
派生クラスがムーブコンストラクトされる際に基底クラスにアクセスしようとする場合であっても
安全に書く方法って何かあるんでしたっけ

782:デフォルトの名無しさん
21/02/19 22:03:03.40 6z9jMlRH.net
作ったクラスをmapにいれるときoperator<を書かなきゃいけないのがめんどい

783:デフォルトの名無しさん
21/02/19 22:08:24.37 aORwmd7L.net
あとムーブコンストラクタを有するクラスを
詳細を隠ぺいする目的でインターフェースを設けたとき
インターフェース経由でムーブコンストラクトする方法って何かあるんでしたっけ
アブストラクトファクトリイーを作るしか無い?

784:デフォルトの名無しさん
21/02/19 22:11:39.72 aORwmd7L.net
この場合アブストラクトファクトリイーといっても、元のクラスFooに対して
IFoo IFoo::move() { ... } が定義してあって
 IFoo x = (適当な生成手段)
ののち、
 IFoo y = x.move()
でxが破壊されるやつ!

785:デフォルトの名無しさん
21/02/19 22:36:29.47 F7SsNRLa.net
それインターフェースとして使えてないよ

786:デフォルトの名無しさん
21/02/20 00:40:16.16 iK8Sr3o/.net
領域が連続しているコンテナなら何でも良いんですが、たとえば array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
memcpy(b.data(), a.data(), n*sezeof(T))
で良いんですかね?
UNIXコマンドと順番が違ったりして間違えそうなのですが、他に良いやり方ありますか

787:デフォルトの名無しさん
21/02/20 01:38:00.62 YJV0xwOV.net
>>771
ド素人かよ

788:デフォルトの名無しさん
21/02/20 01:42:23.87 upzAgg50.net
>>771
領域確保されてるならたぶんそれが最速だけど、普通はstd::copyかな

789:デフォルトの名無しさん
21/02/20 08:11:48.90 BRyl48dG.net
>>761
その「一番弱い」とか言ってるのは前順序だろ。
ククク... 前順序は順序四天王の中でも最弱...
ウィキペディアにも書いてあるのに間違うとは面汚しよ...

790:デフォルトの名無しさん
21/02/20 11:17:36.76 ZF+WEG2v.net
半順序とかいう訳が悪い
英語のpartial orderの方が分かりやすい

791:
21/02/20 11:27:39.73 mkFIMg3t.net
>>774
本によって用語にブレがあるのは数学では常識でしょう?だから>>761 では定義もあわせて書いておきました

792:デフォルトの名無しさん
21/02/20 11:30:33.89 ec7b4JGn.net
あとは裁判で争うしかないでしょうね。
我々には判決が出せませんから。

793:はちみつ餃子
21/02/20 11:52:10.16 N5IkYQZo.net
>>771
前提条件として
・ T の型が trivially copyable である
・ vector の大きさが必要な大きさ分に出来ている
ならそれでもいいよ。
でも、 C の関数を C++ でも使えるのはほとんどが互換性のためでしかなく、
作法的にはあまり使わないに越したことは無いって感じ。

794:はちみつ餃子
21/02/20 11:56:56.24 N5IkYQZo.net
>>771
>>778
と思ったけど、 vector<T> ではなくて vector< vector<T> > なのか。
それだと領域が連続するという前提が成り立たないんじゃないんですかね。

795:デフォルトの名無しさん
21/02/20 12:51:28.34 K0wy5MAI.net
>>770
どういう意味じゃ…
ムーブコンストラクトする手段をインターフェースとして公開したい需要は論理的に有り得る
それともIFoo::move()に実装が伴うからという意味?

796:デフォルトの名無しさん
21/02/20 14:23:36.69 XZPJJfWU.net
>>779
なぜ?
行優先か列優先かは置いといて、vectorの要素は連続するのだからvectorのvectorも連続するのでは?
サイズやキャパシティが変わったときに不連続になりうるということ?

797:デフォルトの名無しさん
21/02/20 14:39:27.43 ZF+WEG2v.net
vectorのvectorの中身はサイズ値とバッファポインタが連続で並んでるだろうな

798:デフォルトの名無しさん
21/02/20 14:57:30.99 upzAgg50.net
>>781
正しくコピーしたければ、
memcpy(b[0].data(), ...)
みたいにしないと。
このとき当然b[1]のデータ領域はb[0]の後ろに連続していない

799:はちみつ餃子
21/02/20 15:27:01.55 N5IkYQZo.net
>>781
vector 型のオブジェクトが連続して並んでいることは保証されるよ。
でも vector 型のオブジェクトのメモリレイアウトがどうなってるかは保証されない。
常識的な実装は >>782 が言う通りヒープから持ってきたメモリのポインタなどを持ってるだけ。
データそのものを内包しているわけではない。

800:デフォルトの名無しさん
21/02/20 16:22:37.93 UDAFNKrx.net
ほらCと同じ基本の部分を教えずにいきなりSTLとか勧めるからこういう初心者が出てくる・・

801:デフォルトの名無しさん
21/02/20 17:06:29.35 1TZxH4Mg.net
ある程度出てきても問題ないだろ。ちゃんとドキュメント読んで理解してくれる人も多いんだろうし、
「Cと同じ基本の部分」を教えたところでちゃんと理解してくれない人も居るだろうし。

802:デフォルトの名無しさん
21/02/20 17:09:29.42 UDAFNKrx.net
ちょっと何言ってるかわかんない

803:デフォルトの名無しさん
21/02/20 17:54:39.09 ZF+WEG2v.net
相談室に初心者が来て何の問題があるのか

804:はちみつ餃子
21/02/20 18:06:15.32 N5IkYQZo.net
>>788
程度による。

805:蟻人間
21/02/20 19:27:14.79 VmESNyRi.net
>>771
> array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
> memcpy(b.data(), a.data(), n*sezeof(T))
> で良いんですかね?
待てよ、b.data()って&b[0]だから型はvector<T>*だろ。書き換えたらいけないアドレスじゃん。
ダメです。

806:蟻人間
21/02/20 19:49:01.06 HfYkFRCd.net
C++のvectorでは、演算子[ ]がオーバーロードされてるから、C言語の常識が通用しないんだよ。
memcpyは危険な関数だから簡単にメモリー破壊できるんだよね。
std::vector v;
int a = 5;
memcpy(&v, &a, sizeof(a)); // vのメモリー破壊。

807:デフォルトの名無しさん
21/02/20 20:38:26.44 PUIofNKd.net
>>791
流石にそれは質問者のレベルにも達してないんで問題外

808:デフォルトの名無しさん
21/02/20 20:44:29.23 Rkd/h2tQ.net
別にここで何が正しいかを結論できなくてもいいのだが
>>776
そう言うなら「推移的かつ反射的であるのみの順序関係」が「弱順序」と書いてある本を
教えてくれる?
手元になかったらうろ覚えでもいいけど。〇〇の××先生がそう言ってたみたいのでもいいw
知識として一応確認しておきたいかなと。

809:
21/02/20 21:19:47.30 mkFIMg3t.net
>>793
>>761 では「推移的かつ反射的であるのみの順序関係が『弱順序』」とはいっていませんよ、よく読んでくださいね
>>761 で言っているのは「一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいい」としかいっていませんですよね‥‥
曲解もはなはだしいと思いますね
ちなみに私の教科書ではこれを「擬順序」と定義しています、大熊正氏の本ですが、私には一生かかっても私には読めないでしょうから、あとはググってください

810:デフォルトの名無しさん
21/02/20 21:44:52.70 K0wy5MAI.net
std::vector v(sizeof(int));
int a = 5;
memcpy(&(v[0]), &a, sizeof(a)); // おk

811:デフォルトの名無しさん
21/02/20 21:47:14.25 K0wy5MAI.net
つかこうかorz
std::vector<int> v((size_t)1);
const int a = 5;
memcpy_s(&(v[0]), sizeof(v[0]) * v.size(), &a, sizeof(a));

812:蟻人間
21/02/20 21:58:40.54 HfYkFRCd.net
この場合は素直にループを書くか、それとも格好良くstd::copy使うのが楽かな。

813:デフォルトの名無しさん
21/02/21 01:26:13.27 G4m9GHw4.net
for文回したら死ぬ病気にでもかかってんのか?

814:デフォルトの名無しさん
21/02/21 01:29:00.28 oO8KGr2m.net
条件を満たすならmemcpyのほうが圧倒的に早いからな

815:はちみつ餃子
21/02/21 01:32:42.66 jd0qgVVy.net
それほど速くならない・速くなくていい場合のほうが圧倒的に多いってのもあるけどな。

816:デフォルトの名無しさん
21/02/21 03:13:29.79 ZrTKdY4P.net
そもそもそんなクソみたいなコードはふつう書かない

817:770
21/02/21 03:54:49.57 HYHVDYIS.net
>>780
IFooっていう名前からしてインターフェースってJava/C#的な意味でのそれだと思ってたけど
それならポインタなり参照なりじゃないと機能してないよっていうかコンパイルエラーでしょってツッコミ

818:デフォルトの名無しさん
21/02/21 03:58:42.63 0HHdBuLy.net
メモリコピーを最適化する前に、他にすべきこと沢山あるだろ的な答えになるよな、確かに。
PG界の真理情報だわ。

819:デフォルトの名無しさん
21/02/21 05:11:43.88 L28MHLBD.net
valarrayでxorとか

820:デフォルトの名無しさん
21/02/21 07:43:27.01 F92hI73d.net
>>802
オブジェクトAがconstメンバとして保持しているブツの所有権を移してオブジェクトBを構築することは
ムーブコンストラクタでないと_なのでムーブコンストラクタである必要があり
この要請はオブジェクト全体が直接アクセスかポインタや参照経由の間接アクセスかとは独立愚連隊、
>>803
真に高速化を求められる内側のループでstd::vector<int> xとかしないから
>>796はひとつながりの省略のないコードとして読んだら判断を誤りうる

821:デフォルトの名無しさん
21/02/21 07:51:19.71 F92hI73d.net
じゃなかったorz
 Foo::Foo(const Foo& src) { (srcを変更して新しいインスタンスを初期化) }
はconst_cast<Foo>的な危険手段でないとやれないが
 Foo::Foo(Foo& src) { (srcを変更して新しいインスタンスを初期化) }
とするとなんかコンパイラが警告を出すから
 Foo::Foo(Foo&& src) { (srcを変更して新しいインスタンスを初期化) }
にせざるおえないという、

822:デフォルトの名無しさん
21/02/21 13:21:42.30 Dqlg3tSu.net
関数と関数オブジェクトってどう使い分けるの?

823:デフォルトの名無しさん
21/02/21 13:30:17.46 YxY+Ievf.net
こういう馬鹿にはちゃんとベンチマークとれって言ってやるのが正しい行い。

824:デフォルトの名無しさん
21/02/21 14:32:16.15 HYHVDYIS.net
>>805
そんなこと聞いてるんじゃなくて
提示されたコード片じゃどう考えても動かないから何したいか分からんのよ
URLリンク(wandbox.org)
こっから始めてどこをどうしたいか教えてくれ

825:デフォルトの名無しさん
21/02/21 14:47:26.80 9WgNecVw.net
404 Not Found

826:デフォルトの名無しさん
21/02/21 15:33:36.83 HYHVDYIS.net
すまん
URLリンク(wandbox.org)

827:デフォルトの名無しさん
21/02/21 16:21:41.69 u2qGdVDT.net
過疎ってるし、初心者どころかJavaの質問でもOKでは?

828:
21/02/21 19:01:13.83 3Ebck9FU.net
>>807
この質問に対して回答をつける用意がありますが、しばしお待ちを

829:
21/02/21 19:27:36.57 3Ebck9FU.net
>>807,813
昔のコードを今読んでみたんですが、実のところ関数オブジェクトにする必要性があったかどうか、今の価値観のもとでは首をかしげています
数値計算のプログラムって、無自覚にバンバン書いてると例えばルンゲ食ったをやっているとこと他とかが混ざり合って収拾がつかなくなる、と思って関数オブジェクトにアイソレートした記憶があって、それを思い出して読んでみたんですけれども、今読んでみても、なんだか、ねえ‥‥
スレリンク(tech板:72番)

830:デフォルトの名無しさん
21/02/21 20:07:12.76 F92hI73d.net
>>809
Fooはこんなやつ、
URLリンク(ideone.com)
IFooは、C++ではよく考えたらIFooのオブジェクトを直接生成できないので(>>802の仰せの通り
std::shared_ptr<IFoo>とかで生成することを考えたのだがエラーになるorz
(上のリンク先のコードでコメントアウトしてあるgenerate_IFoo()
思いのほか闇が深かった\(^o^)/
std::shared_ptr<IFoo>が生成できた暁には、
std::shared_ptr<IFoo> pがリソースの所有権を握ったFooを保持しているとき、
std::shared_ptr<IFoo> qというのがいるとして、
 *q = *p
で所有権を*pから*qに渡したり、
 return *p
で呼び出し元が所有権を有するFooを受け取れるようにしたいワケ

831:デフォルトの名無しさん
21/02/21 20:09:12.28 F92hI73d.net
ちなみにWandboxでソースコードをフォークする方法は
初心者なので
わかり
ません

832:デフォルトの名無しさん
21/02/21 20:14:47.49 LxNhpnKU.net
generate_Foo()がコケてるのはnewのところでFooのコピコンがないだけだろ
コピコン書くか、ムーコン使いたいならnew Foo(std::move(foo3))にすればいいだけ
後半も意味不明
*q = *pってそれスライシングだぞ

833:デフォルトの名無しさん
21/02/21 20:23:47.49 F92hI73d.net
>>817
普通の(ムーブでない)コピコンは書けないなぜなら>>806の理由により
>*q = *pってそれスライシングだぞ
どゆこと?
Foo foo1とFoo foo2だと
foo1 = foo2
とできるのに、

834:デフォルトの名無しさん
21/02/21 20:26:48.03 F92hI73d.net
ちょっと補足すると、IFooには現状代入手段が無いから、
*q = *pはそもそもコンパイルが通ることはなく、目的とする機能を形而上的に表す仮想コード
のつもり

835:デフォルトの名無しさん
21/02/21 21:03:58.63 +My/Unlg.net
>>814
処理を意味でまとめるようなことなら積極的にやるべきだと思いますが、それは関数オブジェクトじゃなくて関数でもできますよね?

836:デフォルトの名無しさん
21/02/21 21:05:03.53 HYHVDYIS.net
>>815
コピー代入演算子とムーブコンストラクタだけ定義するとか意味分からんし
インターフェースによる隠蔽より先にそっち解決しなさい
何がしたいのか自分で本当にわかってる?

837:
21/02/21 21:07:32.53 3Ebck9FU.net
>>820
まあ、そのとおりであり、そうなんですよね…
>>814 は関数オブジェクトである必然性はありません、関数オブジェクトを積極的に使う例としては STL にご登場願うしかないのかもしれませんね

838:デフォルトの名無しさん
21/02/21 22:29:56.45 LxNhpnKU.net
>>818
shared_ptrは関係ないから普通のポインタで話するぞ(同じ事だ)
IFoo* p = new Foo();
IFoo* q = new Foo();
というのがあったとして*q = *p;ってのは何だと思う?
pとqはIFoo*型だ
だからもちろん*pと*qというのはIFoo型だ
すなわち*q = *p;というのはIFoo::operator=(const Foo&)の呼び出しだ
operator=()はvirtualにできないから、pとqが本当はFoo型オブジェクトを指してることなんか知りもしないし考慮もしない
よってIFoo部分の代入だけが行われて、要はqのIFoo部分だけが首チョンパされてpのIFoo部分が代入される
これをスライシングという


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

287日前に更新/256 KB
担当:undef