【问题标题】:How do you add new objects to a user-defined Class vector?如何将新对象添加到用户定义的类向量中?
【发布时间】:2013-09-06 02:42:47
【问题描述】:

我是 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 确实有效的示例。在通过向量创建 class 对象时,我认为我错过了一个基本的难题。

我当时的假设是我声明类型信息错误或没有正确地将信息传递给向量。我会继续努力。任何指向正确方向的指针都将不胜感激!

谢谢,

优化

【问题讨论】:

  • 您正在将 int 类型添加到公民向量中,如果公民有一个接受 int 的构造函数,请使用 emplace。
  • 您是否尝试int 添加到您的向量中?还是您打算将向量扩展 N 个条目?
  • @WhozCraig,仔细阅读问题后,我认为是后者。
  • @chris 我同意这个评价。对此也有一个有趣的看法。我从来没有想过有人会认为这是扩展的方法,然而,我现在完全明白了这条路是如何走的。
  • @WhozCraig 是的,我的目的是将向量(人口)扩展 N 个(新生儿)。

标签: c++ vector push-back


【解决方案1】:

你定义了你的向量来保存 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】:
vector<Citizen> myCitizens (100);

这定义了一个名为myCitizensvector,由Citizen类的100个对象组成,每个对象都用Citizen()初始化。然后,如果我正确地知道您想要做的是调整向量的大小以包含 newBirths 的总数 Citizen 对象,您可以这样做:

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

或者再次使用调整大小:

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

【讨论】:

  • 您的开头段落澄清了我做错了什么,是的,最后一段(向现有向量添加新项目)包含我正在寻找的答案。调整大小绝对是一种更优雅的方式。谢谢!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多