如何将新对象添加到用户定义的类向量中?

时间:2013-09-03 00:48:24

标签: c++ vector push-back

我是C ++初学者(之前没有编程经验)。我正在写一个基于文本的游戏,我有一个核心模块来开发游戏的“人口”。到目前为止,我已经确定了人口增长率(基于预先定义的死亡率和死亡率),我现在要做的是为每个公民创造一个独特的对象。

我创建了 Citizen 类,并使用向量生成最初的公民群体:

vector<Citizen> myCitizens (100);

有一个功能可以为这100个公民中的每一个设置几个初始值。没问题。

该计划的每个“年”计算该年的出生和死亡。我想根据当年的出生人数向 myCitizens 向量中添加新对象。

我坚持这个功能:

声明:

int new_citizens(int newBirths);

定义:

int new_citizens(int newBirths)
{
myCitizens.push_back(newBirths);
}

编译器构建消息:

error: no matching function for call to 'std::vector<Citizen>::push_back(int&)'
note: candidate is:
note: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = Citizen;  _Alloc = std::allocator<Citizen>; std::vector<_Tp, _Alloc>::value_type = Citizen]

我已经搜索了这个问题,查看了文档,搞砸了更改类型无济于事。我编译了push_back工作的例子。在通过向量创建对象时,我想我错过了一个基本的难题。

我当前的假设是我声明类型信息错误或没有正确地将信息传递给矢量。我要继续努力。任何正确方向的指针都会受到赞赏!

谢谢,

Optimae

3 个答案:

答案 0 :(得分:4)

vector<Citizen> myCitizens (100);

这定义了一个名为vector的{​​{1}},其由100个myCitizens类对象组成,每个对象都使用Citizen进行初始化。然后,如果我正确地得到你想要做的是调整向量的大小以包含Citizen() newBirthsCitizen个对象的总数,你可以这样做:

int new_citizens(int newBirths)
{
    // first we need to remove items, after this size() is 0
    myCitizens.clear();

    // and populate vector now
    for(unsigned int i = 0; i<newBirths; i++)
        myCitizens.push_back(Citizen());
}

您也可以使用std::vector::resize来实现这一目标:

int new_citizens(int newBirths){
    myCitizens.resize(newBirths);
}

请注意: 使用resize将容器的大小调整为您在调用此函数时指定的内容:如果当前大小大于您在调用resize时指定的大小或当前大小增加,则容器大小将减小大小小于newBirths

如果你想添加这个数量的新项目到现有的向量,那么你可以这样做:

int new_citizens(int newBirths)
{
    // just add new items
    for(unsigned int i = 0; i<newBirths; i++)
        myCitizens.push_back(Citizen());
}

或再次使用resize:

int new_citizens(int newBirths){
    myCitizens.resize(myCitizens.size() + newBirths);
}

答案 1 :(得分:0)

您将矢量定义为保存Citizen类的对象

vector<Citizen>

函数push_back()接受value_type类型的对象,在你的情况下是Citizen。

void push_back (const value_type& val);

您可以在构造函数中传递数字

vector<Citizen> myCitizens (100);

因为有一个接受数字的构造函数:

explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());

要使你的功能正常工作,你可以写一个循环:

for (int i = 0; i < newBirths; ++i)
{
    myCitizens.push_back(Citizen());
}

chris所述,您可以使用resize()函数。事实上,这将比循环更优雅。

myCitizens.resize(myCitizens.size() + newBirths)

请参阅std::vector resize()

答案 2 :(得分:0)

如果你想添加newBirths新闻公民,那就做一个循环,就像这个

int new_citizens(int newBirths)
{
    for(unsigned int it = 0; it<newBirths; ++it)
        myCitizens.push_back(Citizen()); // <-- uses the default constructor
}