打印出每对向量元素的总和 - C ++

时间:2016-11-03 10:20:13

标签: c++ vector

我正在尝试打印向量中每对相邻元素的总和。但是下面显示的代码并没有给我正确的结果。有人可以帮我这个吗?

int main() {

vector <int> num(10);
vector <int> res(5);
int get = 0;
int range = 0;

for (int i = 0; i != 10; ++i) {
    cin >> get;
    num.push_back(get);
}

while (range != num.size()) {
    int c = 0;
    int c1 = c + 1;
    res.push_back(num[c] + num[c1]);
    if (c == 0)
        c = 1;
    c *= 2;
    ++range;

}
cout << res[7];

for (int u = 0; u != res.size(); ++u) {
    cout << res[u] << " ";
}

return 0;

}

更新: -

我已经在评论部分中提到了这个代码,但是当我编译它时显示出一个调试错误。

我能够在'num'向量中读取1-10个整数。但是当我在向量中读取所有整数后按Enter键时,会发生此调试错误。

int main()
{

    vector <int> num;
    vector <int> res;

    int get = 0;
    int range = 0;
    int c = 0, c1 = 0;

    for (int i = 0; i != 10; ++i) {
        cin >> get;
        num.push_back(get);
    }

    while (range != num.size()) {
        c1 = c + 1;
        res.push_back(num[c] + num[c1]);
        if (c == 0)
            c = 1;
        c *= 2;
        ++range;

    }

    for (int u = 0; u != res.size(); ++u) {
        cout << res[u] << " ";
    }

    keep_window_open();
    return 0;
}

4 个答案:

答案 0 :(得分:0)

我认为问题在于循环增量。 试试这个

while (range < num.size()) 
{
        int c = 0;
        int c1 = c + 1;
        res.push_back(num[c] + num[c1]);
        c += 2;
        ++range;
 }

答案 1 :(得分:0)

我必须更改您的代码以使其编译并使其可重现(一个好的MCVE不需要用户输入):

#include <iostream>
#include <vector>

int main()
{
    const std::vector<int> num =
        { 0, 0,
          5, 10,
          -5, 5,
          3, -20};

    std::vector<int> res;
    unsigned int range = 0;
    int c = 0, c1 = 0;

    while (range != num.size()) {
        c1 = c + 1;
        res.push_back(num[c] + num[c1]);
        if (c == 0)
            c = 1;
        c *= 2;
        ++range;
    }

    for (unsigned int u = 0; u != res.size(); ++u) {
        std::cout << res[u] << " ";
    }
}

您的问题是,您将c乘以2,而不是每次迭代添加两个。

这是一个更惯用的版本:

#include <iostream>
#include <vector>

int main()
{
    const std::vector<int> num
        = { 0, 0,
            5, 10,
            -5, 5,
            3, -20, };

    std::vector<int> res;

    const auto last = num.end();
    for (auto it = num.begin();  it != last;  ) {
        auto v = *it++;
        res.push_back(v + (it == last ? 0 : *it++));
    }

    for (auto v: res)
        std::cout << v << " ";
    std::cout << std::endl;
}

如果这是作业,我建议你确保在交付之前完全理解它。

答案 2 :(得分:0)

您为什么这样做:

if (c == 0)
    c = 1;
c *= 2;

它在第一次迭代中所做的是c = 1然后将其乘以2,因此第二次迭代中c = 2,而c1变为3。 因此,首先您的代码将执行num [0] + num [1],在下一次迭代中它将执行num [2] + num [3],第三次将执行num [4] + num [5],第四次将执行num [ 8] + num [9],依此类推。

我可以看到两种解决方法:

1)如果要进行相邻的加法运算,例如0 + 1、1 + 2、2 + 3,则只需执行c ++而不是这三行代码即可。 2)如果您要进行相邻的加法运算(例如0 + 1、2 + 3、4 + 5),则可以简单地执行c = c1 + 1而不是那三行代码。

答案 3 :(得分:-2)

除了评论中提到的内容之外,我在这里看到的最大问题是,您只是将范围增加1而不是2.这会导致您的代码超过结尾向量,这意味着你的总和被垃圾数据破坏了。