【问题标题】:How to invoke non-default constructors when using vector resize?使用矢量调整大小时如何调用非默认构造函数?
【发布时间】:2014-10-02 11:24:35
【问题描述】:

假设我创建了一个类

class Foo
{
public:
    Foo(int numofCars, int someValue);

private: 
    vector<Car> carList;
}

Foo::Foo(int numofCars, int someValue)
{
    carList.resize(numofCars);
}

我的理解是,在调整向量大小后(carList 是一个空的vector)将通过调用默认构造函数成为Car 对象的列表。

我可以指定被调用的Car 对象的构造函数吗?例如,我不想打电话给Car(),而是打电话给Car(int Value)

【问题讨论】:

  • 你的代码不是合法的 c++..
  • 阅读this
  • @ikh 谢谢,已编辑。
  • 您可以使用emplace_back 将新元素添加到调用您想要的构造函数的向量中,并避免任何副本。

标签: c++ vector constructor c++03


【解决方案1】:

是的,你可以。 (live example)

carList.resize(numofCars, Cars(42));

see more information.


如果你不愿意做不必要的复制,代码有点复杂。

carList.reserve(numofCars);
for (int i = 0; i < numofCars; i++)
    carList.emplace_back(42);

(live example)

这可能更好,但它并不总是有效 - 如果“1 次创建 + 10 次复制”的成本低于“10 次创建”的成本。会根据具体情况而定。

【讨论】:

  • 这会创建一个临时 Car 对象,然后将其复制到新元素中。这很好,如果 Car 的复制成本很低。
  • @NeilKirk 是的。即使resize()很简单,我希望我能找到更好的解决方案>o
猜你喜欢
  • 2021-10-01
  • 2016-04-21
  • 2015-10-20
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2013-03-29
相关资源
最近更新 更多