C 11矢量构造函数复制与范围

C++11 vector constructor copy vs range?

本文关键字:复制 范围 构造函数      更新时间:2023-10-16

我无法理解向量复制构造函数和范围构造函数之间的优势或差异。当我构造这样的三个向量时:

    vector<int> FirstVec(3, 911); //fill constructor
    vector<int> SecondVec(FirstVec.begin(), FirstVec.end()); //range constructor
    vector<int> ThirdVec(FirstVec); //copy constructor

SecondVecThirdVec的内容完全相同。是否有使用其中一种的情况?谢谢。

当您要复制不同类型的容器的项目或不想复制完整范围时,范围构造函数非常有用。例如

int a[] = {1,2,3,4,5};
std::set<int> s{3, 911};
std::vector<int> v0{1,2,3,4,5};
std::vector<int> v1(std::begin(a), std::end(a));
std::vector<int> v2(a+1, a+3);
std::vector<int> v3(s.begin(), s.end());
vector<int> v4(v0.begin(), v0.begin() + 3);

范围构造函数更通用;您可以提供任何有效的合适元素序列,不一定来自同一类型的容器,或者完全跨越整个容器,甚至来自容器。

复制构造函数更简单,更有效。但是,只有在您要复制另一个向量的全部时才适合。

因此,当您想像在此处一样复制相同类型的容器时,请使用复制构造函数;和更通用范围的范围构造函数。

除了上述答案外,还有另一个重要的考虑因素,如果您关心最后的CPU周期和代码字节。

当您使用复制构造函数时,它为库方法提供了完全自由,可以与完整的源向量合作。

使用范围分类器,该方法必须执行更多检查并成为广泛的检查。您可以轻松地想象,范围的末端可能与源向量的末端不同。

让我们假设我们正在开发库代码并查看什么区别:

  • dest。向量和SRC。向量将具有相同的尺寸。
  • dest。向量存储分配仅适用于_src.size。
    • 对于范围副本,它是末端 1。
  • 数据的实际复制也更简单:
    • 例如。想象一下从源到目的地的基于循环的元素副本。
    • 您从源的第一个元素开始,然后复制所有内容。
    • 复制循环终止于源向量的末端,而不是范围。

编译器作家可能会提出更多的积分。

我相信分配器在一种情况下是复制的,但不在另一种情况下。

通常,如果要制作向量的副本,则应复制向量。