打印出每一对向量元素的和

Printing out sum of each pair of vector elements - C++

本文关键字:元素 向量 打印      更新时间:2023-10-16

我试图打印出向量中每对相邻元素的总和。但是下面显示的代码没有给我正确的结果。有人能帮我吗?

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;

}

更新:-

我已经更改了您在注释部分提到的代码,但是当我编译它时,显示了一个调试错误。

我能够将1-10个整数读入'num'向量。但是当我把所有的整数读入vector后按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;
}

你为什么要这样做:

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,而不是这三行代码。

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

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

我不得不改变你的代码,使其可编译并使其可复制(一个好的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,而不是添加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;
}

如果这是家庭作业,我建议你在交作业前一定要完全理解。

使用STL迭代器的一个解决方案:

#include <iostream>
#include <vector>
#include <numeric>
int main()
{
    std::vector<int> v
    { 0, 0,
      5, 10,
      -5, 5,
      3, -20};
    for(auto& r : v) std::cout << r << "t"; std::cout << std::endl; // print
    //Calculate now the adjacent sum (sum of consecutive elements)
    std::adjacent_difference(v.begin(), v.end(), v.begin(), [](const int x, const int y) { return x+y; });//here, set execution policy to parallel if wanted
    v.erase(v.begin()); // pop_front
    // print now every second element. Change i+=2 to i++ if you want every consecutive sum
    for(size_t i = 0; i<v.size(); i+=2) std::cout << v[i] << "t"; std::cout << std::endl; 
    return 0;
}

的结果是:

0       0       5       10      -5      5       3       -20
0       15      0       -17

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