动态数组初始化

时间:2010-09-02 17:23:26

标签: c++

我想创建一个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);
}

4 个答案:

答案 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);