我想创建一个foo的动态数组,项目数为x。参数y和z将传递给项foo的构造函数。我希望做类似的事情:
Foo* bar = new Foo(y, z)[x];
然而,这产生了以下编译器错误:
error: expected `;' before '[' token
所以在与经验丰富的朋友交谈之后,他给了我这个,他承认这是一种懒惰的做法,但它确实有效。我在想,有没有更好/更合适的方式?
Foo* bar = (Foo*) new int[x];
for (int i = 0; i < x; i++) {
bar[i] = Foo(y, z);
}
答案 0 :(得分:11)
“我想创建一个动态数组”所以使用std::vector
,它存在是有原因的。
std::vector<foo> bar(x, foo(y, z));
这会创建一个动态数组,其x
元素初始化为foo(y, z)
。
上面的第二个参数x
次的副本。如果您想为vector
生成值,请使用generate_n
:
std::vector<double> weights;
std::generate_n(std::back_inserter(weights), x, ...);
将...
替换为要调用的函数或函子,它返回一个值。通常你会做一个仿函数:
struct generate_weight
{
double operator()() const
{
return random(1e-3);
}
};
,并提供:
std::generate_n(std::back_inserter(weights), x, generate_weight());
如果你的编译器支持C ++ 0x,你可以利用lambda。这些做同样的事情,除了他们保持代码简洁和本地化:
std::generate_n(std::back_inserter(weights), x,
[](){ return random(1e-3); } );
答案 1 :(得分:1)
如果要将每个元素初始化为相同的值,请按照上面建议的GMan进行操作:
std::vector<foo> bar(x, foo(y, z));
你将有一个X元素的向量,每个元素都有相同的foo(y,z);
如果您想为每个foos创建一个唯一值,则需要在循环中初始化它。一个简单的例子是:
std::vector<foo> bar;
for (int i = 0; i < x; ++i)
{
// initialize X foos with different values for each foo.
bar.push_back(foo(i, random(i)));
}
答案 2 :(得分:1)
首先,您可以在数组new-expressions中使用的唯一初始化程序是()
。因此,如果您想使用new-expression
foo *bar = new foo[x]; // 1. no initializer
foo *bar = new foo[x](); // 2. `()` initializer
根据foo
的定义方式,这两者的行为可能相同或不同。
其次,由于您无法在new-expression中传递构造函数参数(y,z)
,因此必须默认构造数组(如上所示),然后使用赋值为数组元素指定特定值。为此,foo
必须是默认构造和可复制分配。代码看起来非常像您的“有经验的朋友”建议,但具有适当的类型(而不是int
)。你现在拥有的东西是无用的(int
来自哪里?)。很可能你误会了你经验丰富的朋友。这就是它应该看起来的样子
foo *bar = new foo[x];
for (int i = 0; i < x; i++)
bar[i] = foo(y,z);
第三,在您的具体案例中,std::vector
将以更优雅的方式执行相同的操作。
答案 3 :(得分:0)
如果你坚持不使用std至少做得恰当。这不安全,并且存在大的对齐问题。
size_t x = 10;
foo * bar= static_cast<foo*> (::operator new ( sizeof(foo)* x));
for (size_t i=0; i<x; ++i)
{
new (&bar[i]) foo (1,1);
}
::operator delete (bar);