C++相談室 part130 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/03/31(金) 08:47:49.65ID:UkLjKqcm0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part129
http://echo.2ch.net/test/read.cgi/tech/1483940967/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1478440682/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2017/06/26(月) 23:35:53.83ID:GM19K0OY0
なんかムキになってる
相変わらずズレてるね
2017/06/26(月) 23:55:54.69ID:NfcBoQUW0
失敗を通じてしか成長できないのにね
2017/06/27(火) 01:00:05.96ID:NwZhdH240
10年以上勉強さん流石ですw
2017/06/27(火) 08:01:35.53ID:bJ//gE7J0
10年勉強して >>572
残念な人
2017/06/27(火) 10:18:29.05ID:XwCnx1+f0
for_eachを並列で高速化する場合
-D_GLIBCXX_PARALLEL
でopenmp使う場合と
#include <experimental/numeric>
の使う場合と
どっちが高速なの?
578デフォルトの名無しさん (ワッチョイ 17f3-PFpe)
垢版 |
2017/06/27(火) 10:35:07.84ID:TVfTial50
自分でも無意識のうちにやってたし、ネットのサンプルとかでもよくあるけど
厳密にはunsigned intのほうが相応しい場合でもintつかってるコードをよく見かけるが
いちいちintをunsigned intで宣言し直すのもあほらしいしマクロつかって
unsigned intを_u_intとかに置き換えて宣言するのもそこまでしなくてもいいんじゃないかとも思うし
そこらへんはテキトーでいいんっすかね・・・
2017/06/27(火) 10:51:53.32ID:LPANs+0ed
std::size_t じゃなくて?
2017/06/27(火) 11:30:31.53ID:DL/1tDv80
負の値を取らないからって「厳密にはunsigned intのほうが相応しい」とは俺は考えないな
intで済むならintにする
2017/06/27(火) 12:25:58.18ID:+aQQjqLh0
正の数しかとらない変数がまだ初期化されていないことを明示するために負の値(特に-1)を使うとか割とよくある。
2017/06/27(火) 14:22:30.38ID:Gpx2Satod
>>580
・仕様として正の整数
・intの範囲で表せる
が成り立つならintにする?

自分ならstd::size_tを選ぶなあ

>>581
そんな需要があるとはちょっと不思議だ。クラスメンバ?
2017/06/27(火) 14:33:30.02ID:ntBitUxx0
int? i;
が許されるのはC#だっけ?
2017/06/27(火) 14:41:42.08ID:siPR+sC7M
そもそもアドレス宣言と初期化は同時にしろって話だしね
2017/06/27(火) 14:41:58.86ID:siPR+sC7M
アドレス宣言ってなんだ
宣言ね
2017/06/27(火) 15:11:12.82ID:DL/1tDv80
>>582
std::size_tの本来の用途じゃない数値でも使つのか?それはちょっと
2017/06/27(火) 16:00:23.87ID:Gpx2Satod
>>586
ああごめん、もともとは>>578
「 厳密にはunsigned intのほうが相応しい場合でも」
に反応しての発言だった。
2017/06/27(火) 19:00:49.27ID:bJ//gE7J0
>>582
size_tだと64bit環境で64bitになるぞ
2017/06/27(火) 19:02:17.31ID:kIT2/xtQ0
int が 64ビットになるべきだよね
2017/06/27(火) 19:07:21.81ID:bJ//gE7J0
当然そういうコンパイラはある
Windows上だと過去の色々なしがらみなどからintが32bitなのが普通
2017/06/27(火) 19:08:30.52ID:OA/PxRyod
ビット数が気になるなら、<cstdint>のint??_tやuint??_tを使えばいいやんけ。
2017/06/27(火) 19:09:53.97ID:bJ//gE7J0
厳密にはunsignedの方が相応しいってどういう場合を想定してる?

データサイズとかならunsignedの方が相応しいとも限らないよ
2017/06/27(火) 19:11:35.74ID:bJ//gE7J0
>>591
そういう問題じゃない
言語のデフォルトサイズ、一番効率が良いとされているサイズが32bitなのか64bitなのか
の問題
2017/06/27(火) 19:15:41.98ID:OA/PxRyod
その場合はintfast_t, uintfast_tを使う
2017/06/27(火) 19:19:52.85ID:N0WooBY/0
データが持つ意味と型の振る舞いは極力一致させるべきで
型の振る舞いはできる限り制限するべき
負の値を取り得ないならunsignedにする
ローカル変数ならsignedでもいい
2017/06/27(火) 19:30:07.19ID:kIT2/xtQ0
>>590
え?そんなコンパイラが実在するの?
2017/06/27(火) 19:33:33.64ID:OA/PxRyod
>>596
64-bit Linuxとか使ったことねーのか?
2017/06/27(火) 19:37:05.21ID:OA/PxRyod
>>597
ごめんなさい。
2017/06/27(火) 19:51:35.91ID:bJ//gE7J0
特殊な例だとcharからlong longまで全部64bitとかあるぞ
もちろんPCではないけど
2017/06/27(火) 19:52:40.24ID:bJ//gE7J0
こいつが噂のMZか
一人芝居の
601デフォルトの名無しさん (アウアウウー Sa9b-h10b)
垢版 |
2017/06/27(火) 20:06:34.19ID:3pUMWgYLa
>>593
言語つーかCPUに依存しないか。
Core2は64ビット対応でも32ビットのが速い。
64ビットが速いのはCore iからとか。
2017/06/27(火) 20:10:45.68ID:bJ//gE7J0
x86の64bitモードは32bitの方が速い命令がある
キャッシュ容量とかメモリ帯域とかを考えても、絶対に32bitで足りるなら、32bitを選んだ方がいい
2017/06/27(火) 21:37:34.10ID:ExZegnFlr
>こいつが噂のMZか
>一人芝居の

Qの一人芝居はまだ余興として見られるがもう一人のクソコテの一人芝居は痛々しくて見ていられない
2017/06/28(水) 02:28:02.75ID:Irk2C7ZK0
>>595
型の振る舞いをできる限り制限するのは誤りを起こさない、起こしても明確なエラーにするのが目的だと思うんだけど、
符号なし整数型にそういった機能は無くて実際の助けにはならないから、こういう議論が起こる。
2017/06/28(水) 04:29:23.47ID:matoew650
むしろsignedにしておけば不正に負の値が入れられた場合チェックしやすい
2017/06/28(水) 07:46:44.59ID:Aii/VoAq0
符合つき整数との比較や算術演算した際に、warning出たり符合なしに変換されたりと面倒なことが多いから、定義域が非負という理由だけではわざわざ符合なしにはあまりしたくない。
607デフォルトの名無しさん (スプッッ Sd3f-oVeJ)
垢版 |
2017/06/28(水) 08:16:59.41ID:MovvcuP9d
googleのスタイルだと整数は符号ありを使えってなってる
2017/06/28(水) 13:11:58.44ID:4LULrFdtd
APIも64bitは符号ありが多い
609デフォルトの名無しさん (ワッチョイ 7f91-fiUu)
垢版 |
2017/06/28(水) 14:24:20.43ID:qTRul81R0
Vvector<vector<float>> tensor;
のようなテンソルを、1列にまとめて
void Vector_Func(vector<float> &v){}
ベクトルの関数の引数にしたいんだけどさ
これって、新たにVector<float>型のベクトルを定義してそこにベクトルの中身をコピーし、それを利用して関数を呼び出して、さらにもとのテンソルにコピーして戻すしかないのかな?
2度のコピーにかかる時間を短縮できる方法があったら誰か教えて!!!
2017/06/28(水) 14:26:13.68ID:+YCVI2Ik0
typedef vector<vector<float> > tensorf;
それとも右辺値参照的な話だろうか
2017/06/28(水) 14:29:19.59ID:eX7vr1Kz0
参照になっているなら直接vを弄るだけでコピーする必要もないと思われ
2017/06/28(水) 15:12:35.77ID:matoew650
>>609
1列にまとめる必要があるという前提ならどうしようもない気がする
vector<vector<float>>を止めてデータの並びが最初から1列にまとまってるようなテンソルクラスを作るか、
どっかの行列ライブラリを転用するんだな
2017/06/28(水) 16:00:31.95ID:eX7vr1Kz0
参照渡しでvが正常に得られるということは、vectorが値の参照を許容しているとも言える。
2017/06/28(水) 16:46:10.90ID:cWs7iztoM
>>609
iteratorパターンかrange viewのようなものを作る
2017/06/28(水) 18:00:52.06ID:lG20CtJar
612は健常者
2017/06/28(水) 22:05:12.76ID:y88Z2FQA0
>>597
その64bit Linux に乗っているコンパイラは何?
617デフォルトの名無しさん (ササクッテロラ Sp71-kiAr)
垢版 |
2017/06/29(木) 22:16:27.01ID:3dQByb1op
C++の数値計算のコード読んでくとreadmeにSiam journal って雑誌の引用見かける事がやたら多いんだけどc++やる人は必読の雑誌だったりします?
2017/06/30(金) 01:47:04.93ID:66+xb1tk0
C++ってより言語を問わず数値計算やる人だな
高速性が要求される数値計算はC++が使われることが多いってだけ
2017/06/30(金) 01:56:16.60ID:/WxXdso/0
まず数学力を鍛えたほうがいい
2017/06/30(金) 08:34:53.69ID:2shJEbz+r
これがアスペというやつだな
2017/07/01(土) 07:18:19.26ID:C6ffpB7m0
式テンプレートを勉強中です。
X(i) op Y(i)だけで結果が決まる場合はともかく
行列の逆行列のような一要素の計算に行列全部が影響するような計算を
こいつで実装する意味ってありまつか?
実装例とかあったら教えてください
2017/07/01(土) 07:25:20.19ID:qtP/3v2i0
意味というか行列の逆行列のij成分はij余因子を行列式で割った値だと言うことを知っていれば
NxN行列の逆行列の各成分はij余因子行列である(N-1)x(N-1)行列の行列式の計算になるから
数学的帰納法的にテンプレート化可能
2017/07/01(土) 07:49:52.59ID:nS8nnQe50
>>622
君は説明がうまいね
2017/07/01(土) 08:05:35.58ID:qtP/3v2i0
いやそれほどでも・・・///
2017/07/01(土) 08:28:19.10ID:nS8nnQe50
式テンプレートで正項と負項をバサッと消し合うようなことができないかと考えて挫折したなあ
2017/07/01(土) 08:44:48.56ID:C6ffpB7m0
>>622
いや、その余因子を求めることも、そこから行列式を求めるにも、全行列値が必要になるわけだし、
そもそも、余因子行列式の計算はNxN->3x3までの変換が再帰的な計算でスタックを使いたおすことになるので、
ヒープに一時オブジェクトを使わずにすむといという式テンプレートのメリットが全くないんじゃないんですか?

だいたい余因子行列式の除算なんて効率悪すぎて数値計算じゃ使いませんよ。
話をはっきりさせるために、ここは逆行列計算をGauss-Jordanの掃き出し法に限定しましょうや。

>数学的帰納法的にテンプレート化可能
どういう意味です?

数学的帰納法とは、
i=1のときf(1)が成立する
i=nのときf(n)が成立すると仮定すれば
i=n+1のときも成立することを証明して、一般的にf(n)が成立とする
2017/07/01(土) 09:09:28.46ID:C6ffpB7m0
>>626
ちょっと、誤解を招きかねないんで、
余因子行列式が再帰的云々と書きましたが、
余因子に限らず、行列式の計算そのものが再帰的という意味です。
だから、行列式計算そのものがやたら時間がかかる。
大学の試験の答案とかで、途中点をかせぐために(連立方程式を解いて計算間違いするより加点が期待できる)、
余因子行列式/行列式
を明記したりしますが、このやり方はせいぜい手計算でできる4x4程度の話で、
それ以上だと掃き出し法に比較して極端に非効率ということです。
2017/07/01(土) 09:32:16.00ID:T5yR4indr
>>626
>効率悪すぎて数値計算じゃ使いませんよ
「式テンプレートの勉強」を「汎用数値計算ライブラリを式テンプレート化するための勉強」にすりかえられても…

>どういう意味です?
ヒント:回答者は日本語を正しく使えない
2017/07/01(土) 10:10:34.74ID:nS8nnQe50
再帰的に→帰納的に→帰納法的に
jk
2017/07/01(土) 12:42:17.52ID:RfHKhQjf0
数学用語はよくわからんけど
>行列の逆行列のような一要素の計算に行列全部が影響するような計算を
>こいつで実装する意味ってありまつか?
ない

というか式テンプレート勉強するというなら自分で軽く実装してみるべきだよ
↑の場合は速度がどうこう以前の問題だとわかるから
2017/07/01(土) 13:26:13.77ID:T5yR4indr
>再帰的に→帰納的に
これはひどい
再帰的と帰納的は関係ないし、数学的帰納法は帰納的でも帰納法でもない

>>こいつで実装する意味ってありまつか?
>ない
確かに質問に対する明確な回答なのだが、何かこう足りないような…
2017/07/05(水) 14:15:27.50ID:/9Xtn5yvd
scanfより速い標準入力ってない?
スペース区切りの大量のintをベクトルにいれたいんだけどループ回してscanfがどうやっても最速なのかな
633デフォルトの名無しさん (ワッチョイ 6e1c-4/kT)
垢版 |
2017/07/05(水) 15:44:26.17ID:4h6UtxrL0
istream_iterator<int> first(cin), last;
vector<int> wish_of_632{first, last};
2017/07/05(水) 16:39:36.49ID:/9Xtn5yvd
>>633
試してみるサンクス
2017/07/05(水) 16:59:04.15ID:UhWlQCq1r
Visual Studio 2017のリリースビルドで試したが>>633 の方法は倍ほど遅いような
2017/07/05(水) 17:16:22.28ID:2aUA7xnEd
fread, fgets, getchar
2017/07/05(水) 17:22:18.00ID:2aUA7xnEd
int n = 0;
if ('0' <= ch && ch <= '9') {
n *= 10;
n += ch - '0';
} else {
put_int(n);
n = 0;
}
2017/07/05(水) 17:31:38.49ID:2aUA7xnEd
GetStdHandle(STD_INPUT_HANDLE)
2017/07/05(水) 18:03:51.31ID:IVGCprss0
大量=一行10000個程度の数字が10000行ほど?
2017/07/05(水) 18:09:07.25ID:UhWlQCq1r
自前が最速なのだろうが汎用性を考えるとお勧めできない

ある環境での適当な100万個の整数読み込み時間:
 istream_iterator : 470ms
 scanf : 230ms
 fgetc+自前スペース解析+atoi :
175ms
 最初に全部char配列に読み込み+片山式パース: 32ms
2017/07/05(水) 19:23:43.26ID:rZavNuQl0
何のチェックもしないscanf,printfのやり方が最速なのは自明
2017/07/05(水) 20:06:49.25ID:tZeoWZVY0
>>640
>最初に全部char配列に読み込み+片山式パース:

これって随分早いけどパースより読み込みが効いてるんじゃないの
恐らくfgets使ってるんだよね
2017/07/05(水) 20:09:41.12ID:UhWlQCq1r
>>642
fgetsでなくfreadで読んだ
なおこの全読み込み方式で数値の切り出しをatoiにすると80msだったので
やはりI/Oの効率化が支配的と理解した
2017/07/05(水) 21:04:30.49ID:tZeoWZVY0
>>643
てことは
fgetc+自前スペース解析+atoi :175ms
fread++自前スペース解析+atoi :80ms
読み込みのオーバーヘッドで175-80=95msロスしてるわけか

atoiは変換不能文字とか16進とかチェックしてるからその分遅くなるんだろう
自前で10進のみに特化させるのが一番なんだけどもな
2017/07/05(水) 21:05:36.71ID:O+22iBefd
複数スレッドに分けてアセンブラの自作関数で回す
2017/07/05(水) 21:07:40.11ID:O+22iBefd
各スレッドも、複数数値を並列で動かす
2017/07/05(水) 21:08:36.26ID:O+22iBefd
C++スレだった
すまんこ
2017/07/05(水) 21:23:34.13ID:YH3wEyty0
どういう風に並列化できる?
2017/07/05(水) 21:26:33.09ID:2aUA7xnEd
処理すべきブロックに対して、ちょうどいい区切りで、等分割に近い分割をやって、それぞれを別々のスレッドで処理する。
スレッドがすべて終わったら、処理結果を結合する。
2017/07/05(水) 21:28:54.47ID:tZeoWZVY0
スレッドもインラインアセンブラもC++の範疇だよ
ただIOはロックされるから解放待ちの時間が出来てしまう

ラインごとに随時読み込んでスレッド振り分けかな
パースに時間がかかるならそれも悪くないんだろうけど簡易atoi程度じゃ差は出にくい
2017/07/05(水) 21:34:38.31ID:slEXI2jh0
原理的にはブロッキングIOのファイル読み出しの待ち時間を有効に活用すれば
それが最速だけど並列化のオーバーヘッドを最小にしようと思ったら
OS毎あるいはファイルIOのライブラリ毎に特化しなきゃならない気がするので面倒くさい
2017/07/05(水) 21:40:11.90ID:2aUA7xnEd
#ifdef _WIN32
// Windowsの場合
...
#elif ...
2017/07/05(水) 23:16:04.44ID:icFnMa9s0
各スレッドも、前から順番にやってたら遅い
各スレッドのなかでも複数を同時にやらないと

例えば>>637みたいなのだと、各ステップが終わらないと次のステップに進めない
演算の遅延があるので、各演算ポートはスカスカになる
HTで少しはマシにはなるが、それでもスカスカ

整数演算は同時に3個〜4個出来るのだ
これを活かさないと

まあいずれにしろファイルなんか使ってたら読み込み時間がほとんどなので、ガリガリにアセンブラで組む価値もないけど
2017/07/05(水) 23:24:23.81ID:9lrezxXx0
C++のすごい人お願い教えて!!!functionにメンバ関数を代入するにはどうすればいいのか全然わからんのや!!!

#include <iostream>
#include<functional>
using namespace std;

struct C{
    int i=0;
    function<void()> f;
    void A(){ cout << i;}
    void B(){
    f=A;//ここで「reference to non-static member function must be called; did you mean to call it with no arguments?」
//関数A();をstaticにすればエラーは消えるものの、C::A()を呼びたいのではなくc.A();を呼び出したい
    f();
    }
};
void main(void){
    C c;
    c.B();
}
2017/07/05(水) 23:25:58.77ID:pl4REjuI0
釣りならもっと議論の余地のあるネタにしろ
2017/07/05(水) 23:36:21.55ID:pl4REjuI0
f = [this]{A();};
c.f = [&]{c.A();};
二度と来んなカス
2017/07/06(木) 09:30:12.16ID:x5DiEtc40
ファイル読み取りの待ち時間を別スレッドに割り当てるってのは、
誰もが考えつく話だけど、誰もがどうでもいいやと投げ出す話。
2017/07/06(木) 20:44:37.47ID:3RH7JsNg0
テンプレートクラスの継承で↓みたいなことをやりたいんですが
エラーが出てコンパイルが通りません
どこが間違っていますか?もしくはもっと良い方法はありますか?

template< typename T >
class alpha
{
private:
 T mVar;
public:
 alpha( T var ) : mVar( var ) {}
};

class bravo : public alpha< float >
{
public:
 bravo( float var ) : alpha( var ) {}
};
2017/07/06(木) 20:54:42.22ID:1SuD/0Q50
コンパイル通りそうだけど
どんなエラー?
2017/07/06(木) 20:54:56.95ID:r4C+2lo90
なぜ肝心のエラーの内容を書かないのか
2017/07/06(木) 20:58:24.06ID:3RH7JsNg0
658です
コンパイル通りました
すまんこ
2017/07/06(木) 21:29:46.08ID:RDUi9QjP0
ゆるさねえからな
663デフォルトの名無しさん (スプッッ Sd3f-RGC3)
垢版 |
2017/07/06(木) 22:12:30.80ID:8iMXbcNhd
いえいえどういたしまして
664デフォルトの名無しさん (ワッチョイ 9f8f-gRQY)
垢版 |
2017/07/07(金) 00:01:47.76ID:lYH0c+880
ヽ(・ω・)/ズコー
2017/07/10(月) 06:02:24.59ID:kxDJWNLg0
最近は3年毎に仕様改訂されてるC++なので
プロパティはどーなってるのカナー♪
RWPropertyて・・・

このハゲーーーー!!!
違うだろ
ち・が・う・だ・ろーーーー!!!
C#みたいに

class Body{
size_t Chimpo{ get; set;}
};


Body Oreno;
Oreno.Chimpo = 20;
cerr << Oreno.Chimpo <<"cm\n";

と簡単に書きたいんです・す・す
2017/07/10(月) 06:06:24.38ID:kxDJWNLg0
テンプレートなんかでお茶濁し腐って
言語仕様として実装しろつってんだよハゲーーーー!!!
ぶち殺すぞ
2017/07/10(月) 06:07:31.30ID:NdIMybBN0
C#のあれ結局関数だから、下駄と雪駄書きなさい。
2017/07/10(月) 06:21:29.79ID:kxDJWNLg0
はやっ
なんでこんな時間に2chなんかやってんだよ
2017/07/10(月) 06:42:08.85ID:NdIMybBN0
オマエモナー。
2017/07/10(月) 06:48:01.08ID:kxDJWNLg0
俺は超早く寝て朝4:30に起きるように
生活習慣変えたから
2017/07/10(月) 07:03:50.00ID:NdIMybBN0
俺は、夜行性なだけだ。
今日は用事があるからこのまま起きてるが。
2017/07/10(月) 11:54:33.30ID:okOc14zTd
単独プロパティでゲットセット?
あまり需要ないなあ。(個人の感想です)
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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