【问题标题】:Why vector push_back call twice in C++?为什么向量 push_back 在 C++ 中调用两次?
【发布时间】:2021-11-06 19:32:23
【问题描述】:

在下面的程序中,我创建了 3 个 Person 类的对象,并将该对象推送到向量容器中。之后,使用基于范围的 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

提前致谢。

【问题讨论】:

  • vector&lt;Person&gt; per(3); 创建一个包含 3 个默认初始化的 Personvector
  • vector&lt;Person&gt; per(3); 这里的 3 将向量初始化为 3 的大小,并用 3 个对象填充它。这不是必需的,向量会随着每个push_back 增长。
  • vector&lt;Person&gt; per(3); 替换为vector&lt;Person&gt; per; 将解决您的问题
  • 你想要/*const*/ std::vector&lt;Person&gt; per{p1, p2, p3};
  • 删除Person 的默认构造函数可能有助于查明问题。

标签: c++ c++11 vector stl


【解决方案1】:

当你定义向量时:

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 }
    };
    

【讨论】:

  • 最后一个(初始化)甚至允许const vector :-)
  • 非常感谢您对向量的更多解释。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2020-06-20
    • 2023-04-06
    相关资源
    最近更新 更多