容器拷贝

来源:互联网 发布:全途进销存发货软件 编辑:程序博客网 时间:2024/06/08 05:06

在容器的初始化和赋值时常常会对另一个容器(或部分容器)进行拷贝
下面就来讨论下容器拷贝时的一些规则


 容器的定义及初始化

有以下几种方式(并不全是拷贝)

  • 默认构造函数
Container c;            //如果Container是array,则按元素默认值初始化;否则c为空
  • 指定大小的构造函数
Container seq(n);       //n个元素,默认值初始化Container seq(n,t);     //n个元素,值都是t
  • 容器整体拷贝
Container c1(c2);       // c1是c2的拷贝Container c1 = c2;      //其中 c1与c2必须是相同类型(容器类型相同且元素类型相同)
  • initializer_list拷贝
Container c{a,b,c,d};       //列表中的元素必须与Container中元素的类型相容Container c = {a,b,c,d};    //元素类型不要求相同,可以转换即可(相容)
  • 迭代器范围拷贝
Container c(b,e);           //b,e是两个迭代器,构成一个 容器的范围                            //b,e中的元素与Container中元素类型相容即可

容器拷贝的3种方式

从上面知道,在容器创建的初始化阶段有3种拷贝初始化方式

  • 容器整体拷贝

    要求接收容器和被拷贝容器类型完全相同(包括容器类型及元素类型),如果是array则大小也要求相同。

  • 迭代器范围拷贝

    仅要求接受容器和被拷贝容器的元素类型相容,array不支持此种拷贝方式。

  • 初始化列表拷贝

    仅要求接受容器和被拷贝容器的元素类型相容


assign

在对容器进行整体赋值(非初始化)时,仅可以进行 容器整体拷贝 (这对容器类型及元素类型有很高的要求)及 初始化列表拷贝(无法拷贝自另一个容器)。
如果我们仍需要像初始化时那样用迭代器范围拷贝不必在意容器类型的话,可以使用assign函数。

list<string> names;vector<const char*> oldstyle;names = oldstyle;               //错误,容器类型不匹配names.assign(oldstyle.begin(),oldsyle.end());                                   //正确,可以将const char* 转换为 string
  • assign还可以接受一个整型值和一个元素值
names.assign(10,"hello");       //容器names中有10个hello
  • 接受一个初始化列表
names.assign({"hello","world","hello","cpp"});//注意加上{}才是一个初始化列表

assign的作用就相当于对象再次“初始化”


原创粉丝点击