【发布时间】:2018-06-19 00:51:40
【问题描述】:
嘿,C++ 新手,正在研究一个简单的问题,该问题采用 Int 序列并输出数字之和,没有最小和最大数字。
如果向量有一个或没有元素,则返回 0。 这是我的代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int test(vector<int> numbers) {
typedef vector<int>::size_type vec_sz;
vec_sz size = numbers.size();
if (size <= 1) {
cout << "Vector less than 2" << endl;
return 0;
} else {
sort(numbers.begin(), numbers.end());
int answer;
for (int i=1; i < size-1; i++) {
answer += numbers[i];
}
return answer;
}
}
int main() {
vector<int> vec = {2,1,3,4,6,5,7,9,8,10};
cout << test(vec) << endl;
vector<int> vec_2 = {1};
cout << test(vec_2) << endl;
}
当我运行它时,我会得到以下内容:
3829804
Vector less than 2
0
当向量 > 1 时,为什么我得到一个大得离谱的数字,而它只是应该返回 2-8 的总和?
当我在不检查包含 1 个或更少项目的向量的情况下制作程序时,我没有问题。感谢您的帮助!
【问题讨论】:
-
局部变量(比如你的函数中的
answer)默认是未初始化的。它们的值是不确定的(并且看似随机)。在没有初始化的情况下使用这些变量会导致undefined behavior。 -
..... 所以将
int answer更改为int answer = 0。或者,更好的是,用answer替换整个逻辑并在循环中添加值,而不是return std::accumulate(numbers.begin(), numbers.end(), 0) -
您应该打开编译器的警告,这会指出问题所在。
-
@Peter - 你是说
std::accumulate(numbers.begin()+1, numbers.end()-1, 0)吗?由于必须排除第一个和最后一个。 (最好还是跳过所有的存储和排序,只需在输入结束时从滚动和中减去最小值和最大值)。