C 11矢量构造函数复制与范围
C++11 vector constructor copy vs range?
我无法理解向量复制构造函数和范围构造函数之间的优势或差异。当我构造这样的三个向量时:
vector<int> FirstVec(3, 911); //fill constructor
vector<int> SecondVec(FirstVec.begin(), FirstVec.end()); //range constructor
vector<int> ThirdVec(FirstVec); //copy constructor
SecondVec
和ThirdVec
的内容完全相同。是否有使用其中一种的情况?谢谢。
当您要复制不同类型的容器的项目或不想复制完整范围时,范围构造函数非常有用。例如
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。
- 数据的实际复制也更简单:
-
- 例如。想象一下从源到目的地的基于循环的元素副本。
-
- 您从源的第一个元素开始,然后复制所有内容。
-
- 复制循环终止于源向量的末端,而不是范围。
编译器作家可能会提出更多的积分。
我相信分配器在一种情况下是复制的,但不在另一种情况下。
通常,如果要制作向量的副本,则应复制向量。
相关文章:
- C++11:没有复制构造函数的自定义基于范围的循环
- 基于C++范围的循环,容器是否被复制
- 基于范围的 std::move 调用意外复制构造函数
- 如何在块复制期间矢量化范围检查
- 将迭代器范围复制到矢量而不重复
- 删除复制构造函数和运算符=类范围访问
- 如何将字符的范围从字符数组复制到矢量
- C 11矢量构造函数复制与范围
- 将remove_copy_if与ostream_iterator一起使用时确定复制范围的结束
- 对于不可复制类型的范围循环,是否可能
- 在不复制的情况下构建范围内的向量
- 复制范围中的优化
- 为什么 std::copy 抛出错误向量迭代器 + 偏移量超出范围并且无法复制
- 提升范围for_each、绑定、复制和back_inserter的组合失败
- 在范围内存在不可复制的局部变量时按值捕获
- 在可能重叠的范围之间复制类
- 正在从方法范围复制char*
- 如何用范围内的随机值填充数组?(可以复制.)
- 为什么boost::equals要求范围是可复制的?
- 如何在不复制的情况下从n维容器中获得可迭代范围