1 名前:デフォルトの名無しさん mailto:sage [2021/03/24(水) 12:07:15.39 ID:R+oM8cup.net] ※前スレ C++相談室 part154 https://mevius.5ch.net/test/read.cgi/tech/1610096040/ テンプレここまで
387 名前:はちみつ餃子 mailto:sage [2021/04/24(土) 01:45:45.85 ID:ubeHrzBk.net] >>375 仕様上の違いはない。 習慣的にもそれほどはっきりした使い分けが確立しているわけでもなくて 確かに >>376 もひとつの例として納得はできるけども 多いっていうほど多くもないような印象。 どういう意味で使い分けているのかは人 (組織) によるので、 違いがどういう意味を持つのかを一律には言えない。 個人的には、 C のヘッダとしても使えるように配慮した場合は h にするかな。
388 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 01:50:57.50 ID:zTQKHVDv.net] >>376 >>379 なるほど そういや自分もCのヘッダを意識する場合は.hにしてるかもですね どうもです
389 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 02:37:44.86 ID:/oCjni0O.net] >>378 でも STL コンテナの継承って凄い忌避されてる印象を持ってます 罠が多いって やっぱり引数で取って引数で返す方が良いのかな、、、
390 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 03:09:41.49 ID:CW6Yf84b.net] >>381 STLはソース(ヘッダだけど)を見ると物凄く解読に時間が掛かる書き方になって いて、正しく現状どうなって実装されているかを理解するのがとても難しいが、 継承するとなるとちゃんと理解出来てないと危険なので継承したがらない人が 多いのだと思う。
391 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 03:14:32.82 ID:CW6Yf84b.net] >>382 あと、テンプレートを普通のクラスの基本クラスにすることは容易だけど、 テンプレートを継承したテンプレートを作るのは、C++をかなり深く理解して無いと 色々と危険かも知れない。 また、ややこしくしてるのは、perfect forwarding や reference collapsing、 右辺値参照、moveセマンティクスが多用されていることに加えて、 余りドキュメント化されて無い解釈の難しい独自関数を使用して書かれている ことが多いこと。
392 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 03:21:35.70 ID:CW6Yf84b.net] >>383 それ以外にも、template引数に「...」があったり、それを使う場所でも「...」 があったりして、それぞれの意味や展開のされ方を正しく理解するのは難しい。 コンパイラがどういう解釈をするのか途方にくれることが有った。まるで 魔法のように見えることすら。結果的な意味は何とか分かっても、コンパイラが どういう原理や順序で理解したりコンパイルしているのか深く理解できないこと が多かった。 最新のSTLのソースをちゃんと理解できるまでC++を理解するのは、C++を 本格的に勉強する必要がある。
393 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 03:41:23.64 ID:CW6Yf84b.net] >>384 古いC++にも「initializer list」という言葉はあったが、C++11以降は 独特の概念が追加され、それに関連したオブジェクトを関数の引数にとったり できるようになったりして、それの働きを深く理解するのがまた難しい。 また、全体的に lvalue, rvalue に加えて、xvalue, prvalue, glvalueを正確に 理解し、何がどれに属するかを徹底的に理解してなければ、
394 名前:STLのソースコードを 正確に理解することはままなら無い。 僅かでも理解してないことがある状態でSTLのコンテナを独自に継承した テンプレートを作った場合、思わぬ不具合やメモリー関連の原因が特定しにくい バグをアプリ開発で忙しい時に遭遇してしまうかも知れない。 [] [ここ壊れてます]
395 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 03:49:16.98 ID:CW6Yf84b.net] 間違ってるかも知れないが、 initializer_list<T> は、「list initializer」に関係したテンプレートで、 登場したのはC++11移行なはず。 一方、member initializer listや、class initializer listは、名前が同じだが 全く別の概念なはずで、コンストラクタを関数定義する時に、 : MyBase(0), m_x(x), m_y(y) のように書く部分。 initilizer list と list initializer はかなり異なった概念なハズだが、 後者に関係したオブジェクトの型は、initializer_list<T>と書くようだ。 間違っていれば指摘して欲しい。
396 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 03:49:17.13 ID:CW6Yf84b.net] 間違ってるかも知れないが、 initializer_list<T> は、「list initializer」に関係したテンプレートで、 登場したのはC++11移行なはず。 一方、member initializer listや、class initializer listは、名前が同じだが 全く別の概念なはずで、コンストラクタを関数定義する時に、 : MyBase(0), m_x(x), m_y(y) のように書く部分。 initilizer list と list initializer はかなり異なった概念なハズだが、 後者に関係したオブジェクトの型は、initializer_list<T>と書くようだ。 間違っていれば指摘して欲しい。
397 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 04:06:25.90 ID:AUtfiExa.net] クラス A の中で他のクラス B のインスタンスをメンバとして持ちたいとき、B のコンストラクタに引数を渡す方法が初期化リストくらいしかない つまり後でわかる情報を使って B のコンストラクタを呼ぶ方法がない B じゃなくて B のポインタを持てば良いって思うかもしれないが、こんなどーでも良いところでポインタの使用を強制する言語仕様ってゴミだろ もーちょい頑張んなよ、C++クン
398 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 05:28:21.58 ID:n+JXhE4b.net] >>388 バカ?w
399 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 05:36:02.19 ID:RMr7e0df.net] 疑問符はいらないね
400 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 06:48:46.10 ID:glcm53ed.net] using namespace std をヘッダファイル内で使いたいです。なんせ短くなるので でも、そうすることでリスクを負うというのもわかります どう折り合いをつけるべきでしょうか 皆さんはどうされていますか
401 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 06:59:42.53 ID:xdmXCppW.net] >>381 メンバ関数追加するだけならまぁ問題は思いつかないけど(スライシングや非仮想のデストラクタはメンバ変数追加が無ければOK ただ素のvectorからの代入やコピー、ムーブコンストラクトは出来ないので追加で書いてやらないといけない さらにそのメンバ関数を呼ぶには派生型にキャスト(コピーとか防止のために参照でキャスト)をいちいち書かないといけない まぁそんな面倒な派生クラス使うくらいならフリー関数にしといた方が楽だよね そんなこんなで安易な機能追加のための継承(まして継承される前提でないクラスを)ってのは普通避ける
402 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 07:00:28.36 ID:xdmXCppW.net] >>491 そんなの自分で決断すれば
403 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 07:00:46.76 ID:xdmXCppW.net] すまん>>391 だった
404 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 07:13:23.58 ID:RMr7e0df.net] >>391 ARM C++のコンパイラ使ったら? #include <iostream.h> これならstd空間が元々ないよ
405 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 07:14:46.51 ID:+S3huMNR.net] コンテナは継承するまでもないほど完成されていること、 コンテナを継承するくらいならコンテナをメンバ変数にもつクラスを定義したほうが機能拡張や仕様変更に対応しやすい などなどでしょ
406 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 07:59:47.57 ID:glcm53ed.net] >>393-394 でも例えば公開するとかなってくると当然 using namespace std; は問答無用で除くべきですよね? あと近い話で、マクロってどこに書いたら良いんでしょうか REPマクロ等を多用するんですが、同じマクロをいろんなヘッダファイルの冒頭に書くのって変ですか? 共通するマクロは、親に該当する utility.hpp みたいなヘッダファイルを作ってそこに書く等するべきですか?
407 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:07:53.01 ID:RMr7e0df.net] >>397 ああ、それなら俺もやる 開発初期はusing namespace std;で色々試していて 公開がちらついてきたあたりで律儀にstd::を書くスタイルに変えていく
408 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:12:30.74 ID:fCIZIfYl.net] 同じものはまとめるのがプログラミングの鉄則
409 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:15:10.79 ID:V/Qt/+uA.net] 自分はC++17でusingディレクティブでなくusing宣言のパック展開使ってるけど、(using std::cout, std::endl, std::string; とか) これも好ましくないのかな
410 名前:デフォルトの名無しさん [2021/04/24(土) 08:17:39.39 ID:+S3huMNR.net] using std::* したいスコープを独自の名前空間で囲めば他人に迷惑かけずに済む マクロは名前空間を超えるので他人に迷惑かけやすい
411 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:30:55.95 ID:glcm53ed.net] >>401 その理屈だと、公開するプログラムにおいてはマクロはよほどユニークな名前じゃない限り使うべきじゃないってことですか?
412 名前:デフォルトの名無しさん [2021/04/24(土) 08:35:45.72 ID:+S3huMNR.net] ヘッダーファイルでマクロを定義するなら名前衝突を警戒すべきであって理屈とかじゃなくてマナー
413 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:40:34.40 ID:xdmXCppW.net] >>397 ユーザーにincludeされるヘッダじゃなくてcppでだけusingすればいいやろどうせ実装書かないんだから (テンプレートとかでヘッダに実装書くならすでに出てる通り名前空間に隠すとか >>402 まず被らない名前ならいんじゃね それかundefするヘッダも作って使い終わった段階でそれをインクルード
414 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:45:45.71 ID:fCIZIfYl.net] Windowsのmin,maxとかAppleのcheckとか 考えなしの公開マクロ名は使う側に大迷惑だから慎重にしないといけない
415 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 09:19:30.74 ID:aNHhbYgZ.net] minとmaxが関数型マクロなのはやさしさ #include <Windows.h> #include <stdio.h> #include <algorithm> int main() { int a = 3, b = 4; //int x = std::max(a, b); // NG! ビルドエラー int x = (std::max)(a, b); // OK printf("x=%d\n", x); }
416 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 09:57:34.16 ID:RMr7e0df.net] #include <windows.h> #undef max #undef min
417 名前:デフォルトの名無しさん [2021/04/24(土) 10:18:48.27 ID:N1eYD/7j.net] >>398 >>401-403 namespace hoge { using namespace std; プログラム本体 } って書いておけば他と干渉しないんじゃないの
418 名前: mailto:sage [2021/04/24(土) 11:03:59.20 ID:Acac14lu.net] >>307 あなたの粘着力には、ほとほとあきれかえりますね‥‥それって何年前の話? toro.2ch.net/tech/1369350072/171 171 ◆QZaw55cn4c [sage] 投稿日2013/07/11(木) 01:45:29.07 ラプラスは練習中 けれどもどうせ資格試験用だし、むずかしいことははなからやるつもりもないのです、複素関数論なんて一生縁がないとおもう留数とかもう忘れた‥‥ なお、実は 8 年たった今でも私はラプラスは練習中だったりするのです‥‥資格試験の方は諦めていますが いま詰まっている箇所は以下の定理、証明がわからない、誰か教えて‥‥ https://ja.wikibooks.org/wiki/%E5%88%B6%E5%BE%A1%E3%81%A8%E6%8C%AF%E5%8B%95%E3%81%AE%E6%95%B0%E5%AD%A6/%E7%AC%AC%E4%B8%80%E9%A1%9E/%E9%80%A3%E7%AB%8B%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E8%A7%A3%E6%B3%95/%E9%80%A3%E7%AB%8B%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E8%A7%A3%E6%B3%95/%28%73%49%2D%41%29%5E-1%E3%81%AE%E5%8E%9F%E5%83%8F/%E8%A1%8C%E5%88%97%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%81%A8%E4%BD%99%E5%9B%A0%E5%AD%90
419 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 11:32:30.02 ID:plvAJ+CF.net] >>409 ×留数とかもう忘れた・・・ ◎留数なんて勉強してません高卒てすから
420 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 11:40:13.58 ID:TN7U0OWK.net] 学歴コンプレックスって醜いよね〜 ところでラプラスって何ですか? ラプラシアンなら知ってるんですけど Lhaplusのことですか?
421 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 11:53:07.06 ID:zTQKHVDv.net] >>409 そういうのは小さい次元,2x2あたりで計算してみて、大きい次元でも成り立ちそうだなと納得するのが早いかもですな
422 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 12:43:43.67 ID:aNHhbYgZ.net] つか人生相談は板違い、 一生虐げられ続ける弱キャラとしての宿命がC++の規格書に書かれているなら話は別だが
423 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 12:44:49.58 ID:aNHhbYgZ.net] >>407 天才か!
424 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 12:47:38.37 ID:glcm53ed.net] ヘッダオンリーライブラリの体で自作のプログラム配布するときって、全体を namespace でくるむのがマナーなんですかね 普通な名前の関数を定義したりして衝突したら不味いから?
425 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 12:56:34.70 ID:fCIZIfYl.net] ヘッダオンリーに限った話じゃない
426 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 13:00:31.18 ID:xdmXCppW.net] >>414 それならNOMINMAXでいいのでは
427 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 13:05:05.35 ID:aNHhbYgZ.net] >>417 もしプリコンパイルヘッダーに #define NOMINMAX #include <Windows.h> と書いてしまった暁には、マクロ版のmin()やmax()を使いたい人は どうやって生きていくんじゃ……
428 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 13:16:46.63 ID:xdmXCppW.net] なるほど(´・ω・`)
429 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 13:33:18.27 ID:5mKZGvgg.net] boost の多次元配列ライブラリ multi_array を使ってるんだが、両辺の shape が違うときに = で代入できないのがストレスなので、引数の shape が違うときには左辺を右辺と同じようにリサイズしてから代入するように = の定義を変えたい 演算子のオーバーロードってテクを使えば良いらしいが、これは諸刃の剣で注意が必要みたいな記事を見て戦々恐々としてる、、、 代入演算子のオーバーロードで最低限気をつけるべきことってどういうものですかね
430 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 14:01:29.71 ID:F03PJ4BE.net] 気をつけるべきこと 代入演算子を一時的なストレスでオーバーロードしない
431 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 14:04:54.62 ID:xdmXCppW.net] 代入はグローバルに書けないはず メンバとして書くしかない->multi_arrayのヘッダを書き換えるしかない
432 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 14:18:13.19 ID:jLd1Bq7I.net] new して確保するわけじゃない、既存の変数のアドレスを格納するだけのポインタって別にスマートポインタじゃなくて生ポで持てば十分だよね?
433 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 14:33:50.86 ID:RMr7e0df.net] 生ポでいい用途を自信を持って判断できず「念のため」スマポ使うやつでも見かけた?
434 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 14:39:12.20 ID:jLd1Bq7I.net] いや自分が不安なだけ
435 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 15:34:17.33 ID:fCIZIfYl.net] 用途次第だけどnullにならない分参照の方がいいかもしれない もしくはshared_ptrと一緒に使うならweak_ptr
436 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 15:39:23.77 ID:jLd1Bq7I.net] >>426 後出しですみませんが、vector の各要素へのポインタを vector で持つ事も考えてます 参照の vector は普通には持てないので、その意味でももう生ポインタの vector で良いかって気になっていました
437 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 15:46:35.43 ID:fCIZIfYl.net] reference_wrapperなら参照vector作れるけど、そこまでしたくないってことならポインタでいいんじゃない 気をつけてな
438 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 17:56:54.49 ID:F03PJ4BE.net] 考えるべき所がズレてる 既存の変数はポインタを保持してる期間に必ず存在しているか 別スレッドから既存の変数へのアクセスが発生するか 表記方法を考えるのはその後
439 名前:はちみつ餃子 mailto:sage [2021/04/24(土) 18:25:12.58 ID:ubeHrzBk.net] >>423 こういう場面では生ポインタでいいよね? っていう意味? #include <memory> int main(void) { int a; std::unique_ptr<int> b(&a); } むしろ不必要に解放しようとしてワヤになるんで、生ポインタである必要がある。 デリータが何もしないようにすればスマートポインタでも大丈夫ではあるけど、 あえてそうする必要もないし。 >>427 std::vector は要素を追加するなどしたときに再配置が起こる可能性があるから 要素へのポインタ (または参照) を持つのはあまりオススメできない。 (インデックスで持ったほうがいい。) 適切に管理できるならポインタでもそれほど問題でもないんだけど、 質問の雰囲気を見る限り十分な理解があるような感じでもないので……。
440 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 18:40:32.67 ID:F03PJ4BE.net] vectorの中身なら 要素の参照やポインタ vectorの参照やポインタと要素のインデックス イテレター 色々と持ち方があるから 場面場面において適切なのを選ぶ メモリ管理をしてないのにスマポで保持は無い
441 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 22:02:18.72 ID:aNHhbYgZ.net] >>234 あ った >3-5-1. 逆数を精度よく求めれば割り算できる https://qiita.com/square1001/items/1aa12e04934b6e749962
442 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 01:50:20.57 ID:Y3JQTvld.net] >>430 > std::vector は要素を追加するなどしたときに再配置が起こる可能性があるから > 要素へのポインタ (または参照) を持つのはあまりオススメできない。 > (インデックスで持ったほうがいい。) 再配置が起きたとして、ポインタが指してる先が危険にさらされることなんてあるんですか?
443 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 02:05:45.03 ID:NKfmb8Oe.net] newした新しいメモリにコピーして古いのをdeleteしたら古いのを指してるポインタはもう使えんだろ ほら最近初心者への教え方がおかしい&最初からスマポ押し付けるからこういうのが出てくる・・
444 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 02:18:07.61 ID:qqNNQCrU.net] いや new や delete はしないって書いてあるよ よく読んでおじいちゃん
445 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 02:22:40.39 ID:NKfmb8Oe.net] >>435 本気で言ってんのか?
446 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 03:15:48.16 ID:vJWG11Gh.net] 最近のC++が難しく感じる原因は、cppreferenceに頼ってる人が多いから ではないか。あそこはドキュメントの品質が悪くて混乱の原因になる。
447 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 04:11:52.10 ID:vJWG11Gh.net] C++は、代入/コンストラクタがmove系とcopy系で原理的には好き勝手にプログラム できるので、バグが出た時にプログラムの流れを追うためにはmoveとcopyのどちらが 呼び出されているかプログラマがコードから明確に区別ができないと困るね。 その点、デフォルトmoveで、xxx.clone()としない限りは複製されないRustの 設計思想はそれはそれで便利と言えるかな。 どちらが優れているかは一概には分からないかも知れないけれども、デバッグ 時の追いやすさの観点からすればRust流の方が良いかな。
448 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 04:21:43.82 ID:vJWG11Gh.net] >>438 C++の場合は、x=std::move(y);と書けば明示的にmove系が呼び出されるので その場合、混乱は生じないが、右辺が関数の戻り値が構造体型/クラス型の場合、 RVO(Return Value Optimization)が働いたり、右辺が「クラス名(引数列)」 のようなテンポラリオブジェクト作成の場合にはmove系が選択される という「自動振り分け機能」があり、自分が知らないだけでそれ以外にも 特殊なパターンがまだあるかもしれないことが、不安や予想しづらい 原因になっていると思う。 Rustの場合は、自動化されているかと思いきや、実際には、代入などが move/copyのどちらになるかに関しては、自動ではなく、 デフォルトmoveで、x.clone()とした場合にのみcopyという明示的に 区別する方式なんだと思う。
449 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 04:31:24.47 ID:C7wl+mxO.net] std::vector<int> v((size_t)3); printf("&(v[2])=0x%p\n", &(v[2])); v.resize((size_t)5000); printf("&(v[2])=0x%p\n", &(v[2])); ↓実行結果(例) &(v[2])=0x000002376EF91658 &(v[2])=0x000002376EF93A08
450 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 04:50:08.06 ID:2+KF94a+.net] new,deleteが起きないとかいうトンデモ理論はshared_ptr<T>のstd::vectorと混同した感じ?
451 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 05:28:38.68 ID:oSZrNkR7.net] 数値計算畑の人間だけど、numpy with MKL が C++ より速くてワロス もうホントにニッチな領域でしか使わなくなっていくな C++
452 名前: mailto:sage [2021/04/25(日) 05:44:12.98 ID:vI2EHMtp.net] >>442 それはシングルユーザーライセンスであっても 500千円からという価格のインテル製コンパイラやライブラリを使うからなのでは?
453 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 07:18:12.21 ID:U1znDmKO.net] 多次元配列の添字を入れ替える関数を実装したいのですが、任意の次元に対応するものをどう作れば良いのかわかりません。 たとえば v[a][b][c] を v[c][b][a] と入れ替えるのを全ての a, b, c について行ないたいです。 次元が 3 と決まっていれば、整数 a, b, c についてループを回して v_[c][b][a] = v[a][b][c] のようにコピーすれば良いのですが、次元が任意だと鉤括弧 [][][] を用いた要素アクセスをどうすれば良いのか分かりません。 不可能ですかね? その場合、多次元配列を 1 次元で持つことにして、各次元の長さを la, lb, lc,... として、整数 x を 0 から la*lb*lc... -1 まで回して、その都度 x の各桁を取り出して要素をコピーする、みたいなことしかやりようがないですか? そうなると各桁を取り出すのに割り算とか剰余演算を駆使しないと駄目なのでパフォーマンスが落ちるのが懸念です。 あるいは、3 次元に対応した関数、4 次元に対応した関数、…… といった感じで各次元に特殊化した関数を実装するべきでしょうか? できれば一般的というか汎用の関数を作りたいのですが。。。
454 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 07:43:25.17 ID:C7wl+mxO.net] シングルユーザーライセンスであっても 500千円からという価格のインテル製コンパイラやライブラリ を使ってもnumpy with MKL が C++ より速いとかこの世は暗黒だな
455 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 07:46:35.71 ID:NKfmb8Oe.net] v[0]やv[i][0]が配列なのか単一の型なのかは判定できるから enable_ifで分けてオーバーロード(再帰するかしないか)とか出来るはず
456 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 08:25:03.80 ID:1HSCMwQ7.net] >>435 >>435
457 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 09:11:43.96 ID:/NByfBPS.net] >>433 >>427 で「vector の各要素へのポインタ」って書いてるからそっちの話だろう
458 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 10:57:33.64 ID:vJWG11Gh.net] >>445 MKLがIntel製で、 「Intel Math Kernel Library (MKL) というのは, Intel 製の高速な数値計算ライブラリ」 だよ。 つまり、Pythonでは、Intel製の高速なライブラリを使っているが、C++では 使って無い場合の速度比較。
459 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:10:42.39 ID:U1znDmKO.net] >>446 なるほど…… 勉強してみますが大変そうですね 外部ライブラリに頼るか迷いますが、多次元配列は非常に基本的な機能だと思ってるので最低限度で取り回しの良いものを自分で持っておきたいという思いがあります……
460 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:24:49.11 ID:o+U9INbB.net] 自分で作った方が融通がきく
461 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:28
] [ここ壊れてます]
462 名前::33.67 ID:o+U9INbB.net mailto: 作るなら[x] [y] [z]の形にしない方が良い []の中にベクトルを入れる方が融通がきく [] [ここ壊れてます]
463 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 16:15:38.64 ID:r+TKoBrZ.net] >>452 v[ {x, y, z} ] みたいに要素アクセスするってことですか?
464 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 17:26:07.51 ID:Ef2Yns/P.net] MKLが元々c/c++のライブラリってことも知らん輩がおるのか。。 まあ確かにnumpyやってりゃ問題はないが。
465 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 17:43:00.50 ID:C7wl+mxO.net] MKLが元々c/c++のライブラリってことは知ってたが Pythonでシングルユーザーライセンスであっても 500千円からという価格とは思わなかった 、
466 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 17:59:18.91 ID:Nhz8hzcU.net] >>448 生ポインタのvectorってだめなんだ やってたかも まあpush_backとかしなければいいんかしらんけど
467 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 18:15:22.48 ID:S2tV53BX.net] >>454 でも 「numpy with MKL が C++ より速くて」 という言葉からすれば、Pythonの時だけそれを使い、C++の時にはそれを使ってない としか思えない。 PythonでもC++でも同じMKLを使ってて、Pythonの方がC++より 速いなんて事は有り得ないだろうし。
468 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 18:56:01.14 ID:jEvf9lKr.net] >>456 だれも生ポインタのvectorがだめなんて言ってないから何か勘違いしてそう。
469 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 19:04:09.59 ID:/NByfBPS.net] >>456 ん?ダメなのはvector要素へのポインタだぞ?
470 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 19:17:31.67 ID:2+KF94a+.net] >>459 だめなのであれば、std::vectorの存在意義を否定することになりかねない。 C互換の配列およびポインタを実現するコンテナはstd::vectorだけ。 危険性を分かったうえで使う、というのが正しいかと。
471 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 19:26:38.89 ID:/NByfBPS.net] >>460 どういう意味で存在意義を否定することになると言っているんだろうか。 必要に応じて再配置してくれるのもvectorの存在意義だと思っているが?
472 名前:デフォルトの名無しさん [2021/04/25(日) 20:19:11.49 ID:2+KF94a+.net] 昔のstd::vectorは先頭アドレスを取得するメンバ関数data()がなかったのでポインタとして使うことに多少の背徳感があった
473 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 21:16:54.88 ID:JRQD9I35.net] >>453 そう
474 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 21:20:17.62 ID:JRQD9I35.net] >>459 ポインタ保持中にvectorがresizeしないなら ポインタ保持で何の問題もない
475 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 22:15:04.13 ID:yRd8KdQ6.net] 要素の再配置ができない場合や要素のポインタを扱う場合は、多少効率は落ちるがstd::dequeつかえば良いと思う
476 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 22:40:08.86 ID:2+KF94a+.net] >>465 > vector とは異なる欠点として deque は連続した位置のストレージに全ての要素を持つことを保証していないため、ポインタ演算を介しての安全なアクセスの可能性を排除する。 https://cpprefjp.github.io/reference/deque/deque.html
477 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 22:44:46.90 ID:yRd8KdQ6.net] >>466 あぁ、連続要素アクセスは確かにだめだなw
478 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 22:50:09.53 ID:yRd8KdQ6.net] でも、連続要素アクセスならポインタなんか使わずに範囲for分なりiteretor使った方が楽だよね
479 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 22:51:31.52 ID:9+aEf3uB.net] なるべくキャッシュに入れたいって率でメモリ連続性を求めてる人たちはたぶんそれだとキツい
480 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 22:54:28.47 ID:2+KF94a+.net] Win32APIなどOS固有のシステムコールはC言語を前提に作られているので、C++でその恩恵を得たいならメモリ連続性が保証されたコンテナが必要不可欠
481 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 23:17:48.67 ID:yRd8KdQ6.net] APIがらみだとstd::arrayのheap使用版みたいなのが欲しくなることがあるな vectorだと初期化が若干面倒なんだよね
482 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 04:02:46.84 ID:BvXVNvk7.net] >>450 ごめんさらっと言ったけど、現在の各次元のインデックスも実行時の数値として渡す必要あるし再帰と相性悪いかも ただ文法上、次元数に関わらず同じコードで、ってなるとテンプレートと再帰は必須だと思う けどそこまでしても、君が書いてた一次元で除算と剰余使うのと比べてそんな速くなるとも思えんので無理せず一次元でいいと思うw
483 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 11:25:57.38 ID:BvXVNvk7.net] https://wandbox.org/permlink/XpJkS3veZNwNOlaQ 気になったのでやってみた、実測(一次元、および要素数決め打ちとの)はめんどいので頼む・・
484 名前:デフォルトの名無しさん [2021/04/26(月) 14:15:12.52 ID:REE9nEfp.net] numpy のAPIを C/C++ から使うのがお薦め
485 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 14:59:17.98 ID:S9wNYjN0.net] >>473 ありがとうございます 正直 beyond me って感じですが、勉強になります こういう再帰的な定義って STL の [] も同じなんですかね?
486 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 15:04:19.62 ID:S9wNYjN0.net] >>474 これって、numpy の記法で C++ の配列を操るというわけではなく、Python (numpy) を C++ から操るということですよね? 全ての処理を numpy の機能で行なうことにすれば、全ての計算が事実上 C++ で動くことになるから速いって感じなんですかね
487 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 16:39:19.86 ID:BvXVNvk7.net] >>475 いや再帰してるのは単にint[I][J][K]をint[J][K]のループ、さらにint[K]のループに(配列の参照で)分解するためにやってるだけ (そうすればどの階層でもt[i]で書けるから ただこれ、コンパイル時に要素数も次元数もわかってる固定長の配列でしか使えないんだよね ポインタを要素数決め打ちで多次元配列の参照にキャストして渡すのは出来るかもしれんけど・・ まぁ要素数が実行時にしか分からなくても使える一次元での計算のが汎用性高いと思う