2

我有一个(虚拟)函数,它返回std::vector一个单一的值。让我们假设这个类看起来像:

#include <vector>

class Z; // irrelevant

class C
{
    Z& something;

public:
    typedef std::vector<Z*> list_type;

    virtual list_type f();
};

使用重复构造函数是否更好:

C::list_type C::f()
{
    return list_type(1, &something);
}

或者只是push_back()单个元素:

C::list_type C::f()
{
    list_type ret;

    ret.push_back(&something);

    return ret;
}
4

4 回答 4

2

它们在功能方面基本上是等效的,但return list_type(1, &something);可能更有效,因为您直接将向量预分配到其所需的容量,而且您避免调用push_back.

于 2012-07-20T08:06:50.117 回答
2

如果你的编译器足够新来处理 C++11初始化列表,你可以用它来表示:

C::list_type C::f()
{
    return list_type{&something};
}
于 2012-07-20T08:08:04.740 回答
2

如果您认为“更好”是“短代码”,那么重复构造函数可能会更好,因为它更短,因此更简洁。

在功能方面,两者是相等的。

在性能方面,重复构造函数可能会更好,因为它可以reserve()预先知道它将要分配的元素总数。但是,您使用它只是为了创建一个元素,所以我想这并不重要。

于 2012-07-20T08:09:45.723 回答
0

一般来说,使用重复形式会更好,因为vector那样会精确分配N元素,用给定的值初始化它们(与为log2(N)时间重新分配底层数组相比,这将在重复push_back()的情况下发生)。

但是在只有一个指针的情况下,差异可以忽略不计;并使用-O3或任何可能会将这些构造转换为相同的汇编代码。

于 2012-07-20T08:14:28.853 回答