C ++使用给定的构造函数在循环中创建对象

时间:2019-05-06 16:29:34

标签: c++ arrays stdvector

我正在创建一个模仿std::vector的类。

我很快遇到了一个问题,即我无法创建没有默认构造函数的对象数组。我在https://stackoverflow.com/a/4756306/8106847处找到了答案,这使我能够做到这一点。但是现在的问题是我被困在一个特定的构造函数上。

如何传递任何类似的构造函数 std::vector<Obj>(100, Obj(1, "str")) 是吗?

(或者对于不是高级C ++开发人员的人来说太复杂了吗?)

1 个答案:

答案 0 :(得分:1)

我不确定您到底想要什么,但是如果要使用一些默认值初始化列表,然后使用其他方式构造其他列表,则可以根据需要操作列表。让我详细说明一下:

假设这是您定义Obj的方式(将来,包含Obj的实现会很有帮助)

class Obj {
public:
  explicit Obj(int arg1, std::string arg2) : arg1_(arg1), arg2_(std::move(arg2)) {}
  explicit Obj(std::string arg2) : arg1_(25), arg2_(std::move(arg2)) {}

private:
  int arg1_;
  std::string arg2_;
};

现在向量可以具有容量和可选的默认值。 如果您的类型没有一个不带值的构造函数,则无法创建这样的向量(不指定默认值,因此您必须使用所需的任何构造函数创建该对象的一个​​实例来传递默认值) 。您始终可以创建一个空向量,然后将一个项目一个接一个地添加到其中。为了提高性能,如果您知道将要有多少个项目,则可以为它们保留内存点,但暂时不添加它们。这样,您不必担心构造函数,因为尚未创建任何对象。本文中最后的代码片段演示了如何执行此操作。 如果您有int,可以执行以下操作:

std::vector<int> myInts{50, 1};  // make a vector of 50 items with default value of 1
myInts[1] = 26;  // change the second value to be 26.

您可以使用Obj

做同样的事情
Obj defaultValue{100, "Type1"};
std::vector<Obj> myObjs{50, defaultValue};  // make a vector of 50 Objs with copies of defaultValue.

请注意,这些是副本,因此,如果您更改其中一个,则不会更改其他副本。以下与上面相同,但只在一行中(传递rvalue而不是lvalue)。

std::vector<Obj> myObjs{50, Obj{100, "Type1"}};  // same thing as above.

现在,如果您希望某些项目的结构不同,则可以分配不同的值。

std::vector<Obj> myObjs{50, Obj{100, "Type1"}};
myObjs[0] = Obj{"Type2"};

如果您有很多不同的方法来初始化它。然后,您可以做的是避免使用默认值创建列表,并将项逐个添加到向量中。

std::vector<Obj> myObjs;
myObjs.reserve(100);  // expand the capacity but don't actually create any items.
myObjs.push_back(Obj{10, "Type1"});
myObjs.push_back(Obj{"Type2"});