在向量中推回后更改的数字
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】:
您的程序存在以下几个问题:
您正在截断一行中的 double
和 int
:
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 > 1
和else return tableau
,您可以保存一个函数调用。
@Ben,我不知道我们在竞争 :) :)
主要是我。我觉得我总是第二个发帖。真的只是个大孩子。
非常感谢,虽然我的错误真的是......好吧我不会叫我名字大声笑但再次感谢您指出其他错误。如果可以的话,我会再添加一个 +1
@Ben,我们总是与其他 SO 回答者竞争,不是吗?【参考方案3】:
在您的 sommeRecursive 方法中,您会在 int 变量中获得第 i-1 个值而不是 double,因此它会向下舍入(即 3 + 3 + 3.33)
【讨论】:
哇,我觉得自己很笨……谢谢哥们。我应该删除那个问吗?因为它对其他人来说并不真正有趣...... @Gradiuss 这不是您唯一的问题,请阅读其他答案。也不要删除问题。如果人们认为它不值得保留,它将被关闭。但是 atm 是一个很好的主题问题。 好吧,我就这样吧。以上是关于在向量中推回后更改的数字的主要内容,如果未能解决你的问题,请参考以下文章
如何将 shared_ptr 变量推回 C++ 中的 shared_ptr 向量?