9

ベクトルの累積関数を使用しようとしていました

vector <double> A;
double B = 0;

A.reserve(100);
for(itr = 0; itr < 210; itr++)
{
    term1 = pow(r[itr], 12);
    term1 = 1/term1;
    term2 = pow(r[itr], 6);
    term2 = 2/term2;
    A.push_back(term1 - term2);
}
B = accumulate(A.begin(), A.end(), 0);

ただし、私は常にB = 0を取得しましたが、Aにはゼロ以外の値がありました

4

2 に答える 2

24

std::accumulate結果の型が初期値の型であり、コンテナー要素の型ではないという意味で、少し卑劣です! したがって、アキュムレータはints を生成します。

これを修正するには、次のように累積しますdouble

accumulate(A.begin(), A.end(), 0.0);
//                             ^^^^^^^ literal of type double
于 2011-11-22T13:39:07.910 に答える
2

キーは、あなたがどのようにやっているのかかもしれません[...] //値をAに入力 ` vector A double B = 0;

A.reserve(100);
A.push_back(1);
A.push_back(2);
B = accumulate(A.begin(), A.end(), 0);
return 0;

B = 3.0 を解決

予約後に a[0] = 1 を実行している場合、これは悪いコードです。代わりにやりたいことは、サイズ変更と言うことです。

reserve はバッキングメモリ容量を提供するだけで、実際には有効なイテレータを作成しません..したがって、 A.begin() は A.end() に等しいままです

コードの変更を見て、整数演算と倍精度演算の違いがわかりますか? term1 と term2 は一体ですか?

于 2011-11-22T13:35:05.913 に答える