我正在创建一个模仿std::vector
的类。
我很快遇到了一个问题,即我无法创建没有默认构造函数的对象数组。我在https://stackoverflow.com/a/4756306/8106847处找到了答案,这使我能够做到这一点。但是现在的问题是我被困在一个特定的构造函数上。
如何传递任何类似的构造函数
std::vector<Obj>(100, Obj(1, "str"))
是吗?
(或者对于不是高级C ++开发人员的人来说太复杂了吗?)
答案 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"});