19

a のすべての要素を追加する次のコードを検討してくださいvector

#include<iostream>
#include<algorithm>
#include<numeric>
#include<vector>
using namespace std;
int main(void)
{

   std::vector<double> V;
   V.push_back(1.2);
   V.push_back(3.6);
   V.push_back(5.6);
   double sum = accumulate(V.begin(),V.end(),0);

   cout << "The sum of the elements of the vector V is " << sum << endl;
   return 0;
}

これを Windows の Cygwin でコンパイルして実行すると、ターミナルで次のような出力が得られます。

ベクトル V の要素の合計は 9

このaccumulate関数は、すべての数値を切り捨てて合計しているように見えます。これで答えが説明されます。

これは、Cygwin g++ コンパイラーに何か問題があるのでしょうか、それとも s を加算するための関数の解釈が間違っているのaccumulateでしょうか?vectordouble

4

4 に答える 4

36

std::accumulate次のように宣言されています。

template <typename InputIt, typename T>
T accumulate(InputIt first, InputIt last, T init);

の 2 番目のテンプレート引数は、タイプが であるため、std::accumulateと推定されます。のように、代わりに double を渡します。int0int0.0

于 2013-12-23T01:25:08.953 に答える
6

に変更00.0ます。それは10.4私のために取得します。コンテナーは double ですが、型推論はintに渡される初期引数によるものstd::accumulateです。したがって、コンテナにはint値が割り当てられます。

于 2013-12-23T01:24:31.873 に答える
5

std::accumulate 関数から返される値は、次の理由により double ではなく整数です。

double sum = accumulate(V.begin(), V.end(), 0);
//                                          ^-- Integer!

C++ コンパイラによって行われるテンプレート パラメーターの推論により、accumulate関数の戻り値の型がパラメーターと同じになりinitます。この場合は整数です。したがって、戻り値は最も近い整数に丸められます。戻り値は、に代入されるときに暗黙的に double にキャストされsumます。

0.0これを修正するには、代わりにゼロを double (つまり ) として渡すだけです。

于 2013-12-23T01:27:20.213 に答える
3

呼び出しの最後の引数はstd::accumulate、内部合計の型と戻り値の型を決定します。0であるためint、加算時にすべてが切り捨てられ、結果も整数になります。

于 2013-12-23T01:26:18.970 に答える