首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11向量构造函数拷贝与范围?

C++11向量构造函数拷贝与范围?
EN

Stack Overflow用户
提问于 2015-05-08 10:09:32
回答 4查看 8.5K关注 0票数 7

我不明白向量复制构造函数和范围构造函数的优点或区别。当我构造像这样的三个向量时:

代码语言:javascript
复制
    vector<int> FirstVec(3, 911); //fill constructor
    vector<int> SecondVec(FirstVec.begin(), FirstVec.end()); //range constructor
    vector<int> ThirdVec(FirstVec); //copy constructor

SecondVecThirdVec的内容完全相同。是否有使用其中之一具有优势的方案?谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-08 10:16:13

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

代码语言:javascript
复制
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);
票数 17
EN

Stack Overflow用户

发布于 2015-05-08 10:20:46

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

复制构造函数更简单,而且可能更高效;但仅当您想要复制另一个向量的全部时才适用。

因此,当您想要复制相同类型的容器时,请使用复制构造函数,就像在这里所做的那样;对于更一般的范围,使用范围构造函数。

票数 5
EN

Stack Overflow用户

发布于 2015-05-09 02:11:00

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

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

使用范围说明符,该方法必须执行更多的检查,并变得更一般化.正如您可以很容易想象的那样,范围的结束可能与源向量的结束不一样。

让我们假设我们正在开发库代码,并查看其中的区别:

  • 最棒的。向量和src.矢量将有相同的大小。
  • 最棒的。矢量存储分配只是用于_src.size。
    • 对于范围复制,它是结束-开始+1.

  • 数据的实际复制也更简单:
    • 例如,设想一个从源到目的地的基于循环的元素副本。

    • 从源的第一个元素开始,复制所有内容。

    • 复制循环终止于源向量的末端,而不是range.end。

一个编译器作者可能会想出更多的观点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30121228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档