赋值和std ::向量的副本

时间:2015-09-15 18:03:22

标签: c++ c++11

我有大型的复杂课程,我想这样做

class A
{
///a lot of things
vector<something> vs;
};

和复制构造函数

A::A(const A& a)
{
   vs=a.vs;
}

反对这个

A::A(const A& a)
{
   copy(a.vs.begin(),a.vs.end(),back_inserter(vs));
}

哪一个更好?

2 个答案:

答案 0 :(得分:5)

如果您正在编写自己的复制构造函数,则应使用成员初始化并直接从源构造向量。

myEvents.Sort(
                delegate(MyEvent e1, MyEvent e2)
                 {
                     DateTime dt1;
                     DateTime dt2;
                     DateTime.TryParse(e1.StartDateTime.MMDDYYYYHHMMSS, out dt1);
                     DateTime.TryParse(e2.StartDateTime.MMDDYYYYHHMMSS, out dt2);

                     return dt2.CompareTo(dt1); // descending
                     //return dt1.CompareTo(dt2); // ascending
                    }
            );

现在,如果所有类成员都是可复制构造的,那么您不需要复制构造函数,因为编译器提供的构造函数就足够了。

答案 1 :(得分:4)

最好的方法是既不依赖也不让编译器完成它的工作。它会为你生成最佳的复制构造函数,除非你有特殊的数据成员(还有待观察)。然后,只有这样,您是否必须担心编写自己的复制构造函数(并且可以使用@NathanOliver指出的成员初始化)。

我知道它不是你的实际问题,而是与它紧密相关:如果你想使用带有vector参数的常规构造函数,最好的方法是使用成员初始化,它将调用{的复制构造函数{1}}(您的标准库将为此编写最佳代码)。

vector