【问题标题】:Why does push_back() create two zeros at the start of the vector [duplicate]为什么 push_back() 在向量的开头创建两个零 [重复]
【发布时间】:2020-09-13 20:21:48
【问题描述】:

考虑以下代码和输入

#include <iostream>
#include <vector>
using namespace std;

int main() {
     int n;
     cin >> n;
     vector<int> v(n);

     while(n--) {
         int a, b;
         cin >> a >> b;
         v.push_back(a);
         v.push_back(b);
     }

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

输入

2
1 2
3 4

我期望的输出 1 2 3 4

我得到的输出 0 0 1 2 3 4

我不理解 vector.push_back() 的什么行为?

【问题讨论】:

  • 为什么 push_back() 会在向量的开头创建两个零 vector&lt;int&gt; v(n); 我假设您输入了 2。跨度>
  • Rubber ducky 想知道vectorvector&lt;int&gt; v(n); 之后有多少项
  • 完全注释掉你的while循环,看看它打印了什么。
  • vector&lt;int&gt; v(n); 创建一个 n 零向量。使用vector&lt;int&gt; v; 创建一个空向量,将大小更改为2*n 并将push_backs 替换为v[i] = ...
  • 你也可以把vector&lt;int&gt; v(n);改成vector&lt;int&gt; v; v.reserve(n);

标签: c++


【解决方案1】:

我不理解 vector.push_back() 的什么行为?

push_back 做你所期望的;问题是vector&lt;int&gt; v(n);,在您的示例中,使用2 元素创建向量。最简单的修复是vector&lt;int&gt; v;

【讨论】:

    【解决方案2】:

    push_back() 插入新元素。它不进行分配。请注意,在使用push_back() 插入新元素之前,您的向量大小为n,因此您将拥有一个大小为3n 且具有n 前导零的向量。请改用以下内容:

    vector<int> v(2*n);
    for (size_t i{}; i < n; ++i) {
        int a, b;
        cin >> a >> b;
        v[2*i] = a;
        v[2*i + 1] = b;
    }
    

    vector<int> v;
    v.reserve(2*n);
    while (n--) {
        int a, b;
        cin >> a >> b;
        v.push_back(a);
        v.push_back(b);
    }
    

    【讨论】:

    • 另外size_t i{};是个奇怪的选择,会不会一直被构造成0。
    • @user4581301 我没有注意到我在第一个 sn-p 中没有像在第二个中那样将 n 更改为 2*n。我已经编辑过了。
    • @M.A 是的,它总是零
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2014-01-23
    相关资源
    最近更新 更多