我有一个(虚拟)函数,它返回一个带有单个值的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;
}
答案 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
或其他任何可能将这些结构转换为相同的汇编代码。