为什么 vector push_back 在 C++ 中调用两次?

Why vector push_back call twice in C++?

在下面的程序中,我创建了 class Person 的 3 个对象,并将该对象推送到 vector 容器中。之后,使用基于范围的 for 循环调用显示函数并打印姓名和年龄。

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

class Person
{
    private:
        string _name;
        int _age;
        
    public:
    
    Person()
    {
    
    }

    Person(string name, int age) : _name(name), _age(age)
    {
        
    }

    void Display()
    {
        cout<<"_name : "<<_name<<" => "<<"_age : "<<_age<<endl;
    }
};

int main()
{
    Person p1("User1", 20);
    Person p2("User2", 30);
    Person p3("User3", 25);
    
    vector<Person> per(3);
    
    per.push_back(p1);
    per.push_back(p2);
    per.push_back(p3);
    
    for(auto obj : per)
    {
        obj.Display();
    }
}

但我不明白我在这里缺少什么来获得输出

_name :  => _age : -1
_name :  => _age : -1
_name :  => _age : -1
_name : User1 => _age : 20
_name : User2 => _age : 30
_name : User3 => _age : 25

而不是

_name : User1 => _age : 20
_name : User2 => _age : 30
_name : User3 => _age : 25

提前致谢。

您正在创建一个大小为 3 的向量,之后,您要向该向量添加另外 3 个元素。插入 3 个人后,尝试打印出向量中存储的元素数 (per.size())。

定义向量时:

vector<Person> per(3);

您将大小设置为 3,这意味着将创建三个默认构造的元素并将其添加到向量中。

然后再添加三个,因此向量中总共有六个元素。

如果你只想要你的三个元素,有几个选择:

  1. 只保留内存,不设置大小:

    vector<Person> per;
    per.reserve(3);  // Allocates memory for 3 elements, doesn't set the size
    per.push_back(p1);
    per.push_back(p2);
    per.push_back(p3);
    
  2. 不要反推,使用索引设置元素:

    vector<Person> per(3);
    per[0] = p1;
    per[1] = p2;
    per[2] = p3;
    
  3. 用你想要的元素初始化向量:

    vector<Person> per = {
        { "User1", 20 },
        { "User2", 30 },
        { "User3", 25 }
    };