【问题标题】:Adding Integers In A Vector在向量中添加整数
【发布时间】:2012-12-25 17:46:35
【问题描述】:

好的,我还有另一个挑战。我有一个问题要我“将一组整数读入vector。打印每对相邻元素的总和。更改您的程序,使其打印出第一个和最后一个元素的总和,然后第二个和倒数第二个的总和,以此类推。”

目前我已经设法让它添加连续的数字,不完全成对,但尽可能接近。

到目前为止,我为vectors 学习的唯一运算符,以及我希望使用的问题是:v.empty();v.size();v.push_back(t);v[n];v1 = v2;v1 = {a,b,c...};v1 == v2;v1 != v2; <<=>>=

这是我现在的代码:

#include <iostream>
#include <string>
#include <vector>

using std::string; using std::vector; using std::cout; using std::cin; using std::endl;

int main ()
{
    vector<unsigned> numbers {5, 6, 7, 8, 9, 10, 11};
    unsigned sum;

    decltype(numbers.size()) count;
    for (count = 0; count < numbers.size(); ++count){
        sum = (numbers[count]++) + (numbers[count]);
        cout << sum << " ";
    }
}

所以我可以让它加 5+6; 6+7; 7+8 等等……但对于每一对和所有其他的,不能 100% 确定从哪里开始。任何指导将不胜感激!

【问题讨论】:

  • sum = (numbers[count]++) + (numbers[count]); 是一个非常糟糕的行。 sum = 2*numbers[count]+1; numbers[count]++; 更清晰;
  • 为了增加乐趣,当你的类到达迭代器时,重新审视这个问题并尝试使用 std::transform。如需加分,请尝试 boost::transform_iterator 然后(for 循环被禁止)。
  • @MarcGlisse 是的,我迫不及待想要进入迭代器章节!一旦我消化了这里的所有信息,我将继续前进!太棒了!

标签: c++ vector integer


【解决方案1】:

我认为您当前的代码不适用于不同的示例。您需要将numbers[count]++ 更改为numbers[count+1] 以使其工作,并将循环的结束条件更改为size()-1

至于你的另一个问题,如果你只循环一半向量并添加v[i] + v[v.size() - i - 1]的数字,你应该可以做到

编辑:按照 borisbn 在 cmets 中的建议,将 -1 添加到 v[v.size() - i - 1]

【讨论】:

  • 我认为不是v[i] + v[v.size() - i],而是v[i] + v[v.size() - 1 - i]
【解决方案2】:

打印每对相邻元素的总和。

auto count = numbers.size();
for (auto i = 0; i < numbers.size()-1; i++)
{
    std::cout << (numbers[i] + numbers[i+1]) << "\t";
}

输出第一个和最后一个元素的总和,然后是第二个和倒数第二个的总和,以此类推

for (auto i = 0; i < count/2; ++i) 
{       
   std::cout << (numbers[i] + numbers[count - i -1]) << "\t";     
}

注意:如果向量有奇数,第二次打印不会计算中间的一个

sample输出

【讨论】:

  • 增加计数将跳过向量中的每个第二个元素。
  • 我不确定,但似乎在同一个表达式中使用count++countUB。不是吗?
  • @borisbn 应该没问题,我可以更新以清除代码,请参阅我更新的答案
【解决方案3】:

在两个循环下方,打印 (1) 相邻对的总和和 (2) 对立元素的总和。

#include <cstddef>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main ()
{
    vector<unsigned> numbers {5, 6, 7, 8, 9, 10, 11};
    auto N = numbers.size();

    std::cout << "first part\n";
    for (size_t i = 1; i < N; ++i) {
       std::cout << numbers[i-1] + numbers[i] << "\n";
    }

    std::cout << "second part\n";
    for (size_t i = 0; i < (N - 1 - i); ++i) {       
      std::cout << numbers[i] + numbers[N - 1 - i] << "\n";   
    }
    // in case you have an odd number of elements
    if (N % 2 == 1) std::cout << numbers[N / 2] << "\n";

}

LiveWorkSpace 上的输出

【讨论】:

  • 这看起来很棒!不过,我可以问一下 size_t,它是在哪里定义的或者它到底是做什么的?
  • @user1942453 std::size_t&lt;cstddef&gt; 中定义,它是一个无符号整数类型,其大小足以容纳适合 STL 容器(例如向量)的许多元素。这会自动使您的代码成为 64 位证明。我将答案更新为#include &lt;cstddef&gt;
  • 最后一件事我不太明白...为什么在第 2 部分中是 [N - 1 - i]?这真的让我很困惑!
  • @user1942453 在 c/c++ 数组索引中从 0 开始,所以第一个元素是 numbers[0],第 N 个元素是 numbers[N-1],从末尾开始的第 i 个元素是 numbers[N-1-i]
【解决方案4】:

你好,我在 VS 上试过这个,它成功了

vector <int> num;
num.push_back(5);
num.push_back(6);
num.push_back(7);
num.push_back(8);
num.push_back(9);
num.push_back(10);
int count = 0;
for(;count < (num.size()-1);count++)
{
        int sum =0;
        sum = num[count] + num[count+1];
        cout<<sum<<endl;
}
 for(int c =0; c < (num.size()-1);c++)
  {
   int altrsum = num[c]+ num[(num.size()-1)-c];
   cout<<altrsum<<endl;
  }

希望这会有所帮助。

【讨论】:

  • 哇!感谢大家的热烈响应!这很棒!!这很有帮助,而且看起来非常简单……让我想知道为什么我不能完全理解它。我今天肯定学到了一些东西!
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多