在向量中推回后更改的数字

Posted

技术标签:

【中文标题】在向量中推回后更改的数字【英文标题】:number changed after push back in vector 【发布时间】:2016-02-03 22:26:04 【问题描述】:

这是我的代码(不要介意法语部分,关键是代码本身):

#include <iostream>
#include <vector>

using namespace std;

double SommeRecursive(vector <double> tableau) 
    int i = tableau.size();
    if (i > 1) 
        vector <double> clone = tableau;
        int dernier = clone[i-1];
        clone.pop_back();
        return dernier + SommeRecursive(clone);
    


int main(int argc, char** argv) 
    vector <double> tableau;
    double nombre;

    cout << "Nombre 1 : ";
    cin >> nombre;

    tableau.push_back(nombre);

    cout << "Nombre 2 : ";
    cin >> nombre;

    tableau.push_back(nombre);

    cout << "Nombre 3 : ";
    cin >> nombre;

    tableau.push_back(nombre);

    cout << "Résultat : " << SommeRecursive(tableau) << endl;

    return 0;

我在使用后测试我的代码

gcc -std=c++14 -o main main.cpp && ./main

如果我输入像 3.33、3.33 和 3.33 这样的数字,我得到的结果是 9.33 而不是 9.99。知道为什么吗?

【问题讨论】:

【参考方案1】:

这一行是你的问题:

int dernier = clone[i-1];

你正在转换为一个 int。所以当你的递归函数计算它会这样做:

(int) 3.33 + (int) 3.33 + 3.33 = 3 + 3 + 3.33 = 9.33

我也怀疑你的递归函数应该是:

if (i > 1) 
   ...
   double dernier = clone[i-1];
   ...
 else 
   return tableau[0]; // This is your base condition.

Here is a live example.

【讨论】:

是的,我应该为那部分添加一个 else 。但是解决方案返回 0.0 也很好而且很快。 @Gradiuss,实际上返回 0.0 的方法比较慢。它需要额外调用SommeRecursive,这意味着上下文切换和潜在的缓存未命中等。【参考方案2】:

您的程序存在以下几个问题:

    您正在截断一行中的 doubleint

    int dernier = clone[i-1];
    

    当输入为空向量时,函数SommeRecursive 没有return 语句。因此,您的程序表现出未定义的行为。

改成:

double SommeRecursive(vector <double> tableau) 

   int i = tableau.size();

   if (i > 0) 
      vector <double> clone = tableau;
      double back = clone.back();
      clone.pop_back();

      return back + SommeRecursive(clone);
   

   return 0.0;

进一步细化避免创建输入向量副本的函数:

double SommeRecursive(std::vector<double>::const_iterator begin,
                      std::vector<double>::const_iterator end)

   if ( begin == end )
   
      return 0.0;
   

   return *begin + SommeRecursive(begin+1, end);


double SommeRecursive(std::vector<double> const& tableau)

   return SommeRecursive(tableau.begin(), tableau.end());

【讨论】:

这一次我打败了你!但是很好+1。此外,如果您执行i &gt; 1else return tableau,您可以保存一个函数调用。 @Ben,我不知道我们在竞争 :) :) 主要是我。我觉得我总是第二个发帖。真的只是个大孩子。 非常感谢,虽然我的错误真的是......好吧我不会叫我名字大声笑但再次感谢您指出其他错误。如果可以的话,我会再添加一个 +1 @Ben,我们总是与其他 SO 回答者竞争,不是吗?【参考方案3】:

在您的 sommeRecursive 方法中,您会在 int 变量中获得第 i-1 个值而不是 double,因此它会向下舍入(即 3 + 3 + 3.33)

【讨论】:

哇,我觉得自己很笨……谢谢哥们。我应该删除那个问吗?因为它对其他人来说并不真正有趣...... @Gradiuss 这不是您唯一的问题,请阅读其他答案。也不要删除问题。如果人们认为它不值得保留,它将被关闭。但是 atm 是一个很好的主题问题。 好吧,我就这样吧。

以上是关于在向量中推回后更改的数字的主要内容,如果未能解决你的问题,请参考以下文章

在没有对象的情况下推回向量中的对象

如何将 shared_ptr 变量推回 C++ 中的 shared_ptr 向量?

为啥最后一个推回对象的字段到向量中会转移到向量的其他对象? [关闭]

将指针向量元素推回非指针向量c ++时出错

将对象推回向量指针,对象类进入命名空间

将指针推回指针向量是不是存在内存泄漏?