【问题标题】:C++ vector accumulatesC++ 向量累加
【发布时间】:2011-11-22 13:29:07
【问题描述】:

我正在尝试对向量使用累积函数

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 有非零值

【问题讨论】:

  • 我们能看到填充 A 的代码吗?
  • 您应该发布一个最小的代码示例来重现您的问题。这段代码并没有真正的帮助。
  • 更多代码需要例外。
  • 这段代码真的没用。现在我们只能说:你在[...]写了一个bug
  • 仍然没有改变任何东西,我仍然得到 0

标签: c++ vector accumulate


【解决方案1】:

std::accumulate 有点狡猾,因为结果的类型是初始值的类型,不是容器元素的类型!所以你的累加器产生ints。

要解决此问题,请累积到 double

accumulate(A.begin(), A.end(), 0.0);
//                             ^^^^^^^ literal of type double

【讨论】:

    【解决方案2】:

    关键可能是你的表现 [...] //将值填充到 A ` 向量 A 双 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 和 term 2 是积分的吗?

    【讨论】:

    • 它们是双打的,而且我的累加语句有问题(我不得不输入 0.0)......非常狡猾
    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2017-06-28
    相关资源
    最近更新 更多