使用单个值初始化std :: vector - 重复或push_back()?

时间:2012-07-20 08:02:21

标签: c++ stl vector constructor std

我有一个(虚拟)函数,它返回一个带有单个值的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 个答案:

答案 0 :(得分:2)

它们在功能方面基本相同,但return list_type(1, &something);可能更有效率,因为您可以直接将矢量预先分配到所需的容量,另外还可以避免调用push_back

答案 1 :(得分:2)

如果您的编译器足够新以处理C ++ 11 initializer lists,您可以使用它来说:

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

答案 2 :(得分:2)

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

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

就性能而言,重复构造函数可以更好,因为它可以调用reserve(),因为它事先知道它将要分配的元素总数。但是,你只是用来创建一个元素,所以我想这没关系。

答案 3 :(得分:0)

通常,使用重复形式更好,因为vector然后会精确分配N个元素,用给定的值初始化它们(与重新分配基础数组log2(N)次相比,这将是在重复push_back()的情况下发生。

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