第3条:确保容器中的对象拷贝正确而高效
1,copy in,copy out是stl的工作方式,即向容器中加入对象时,存入容器的是你指定对象的拷贝,从容器中取出对象时,得到的是容器中所保存的对象的拷贝。
2,拷贝对象时STL的工作方式,当对vector,string或deque进行元素的插入或删除操作时,现有元素位置通常会被移动(拷贝)(见第5,14条),如果使用排序算法(见第31条)如next_permutation,previous_permutation,remove,unique或类似操作(见第32条),rotate或reverse等,对象将会被移动(拷贝)。
3,对象的拷贝通常是利用对象的拷贝成员函数特别是对象的拷贝构造函数和拷贝赋值操作符(见第11,27条),如果没有声明这两个函数,编译器会声明;内置类型(如整形,指针类型等)的实现总是简单的按位拷贝。
4,所以如果向容器中填充对象,而对象的拷贝操作又很费时,那么填充对象这个简单的操作就会成为程序的性能瓶颈;而且如果这些对象的拷贝有特殊含义,则将他们放入容器会不可避免的产生错误(引起错误的一种可能情形见第8条(比如auto_ptr,标准规定auto_ptr容器(简称COAP)是被禁止的,大多数的C++编译器对使用了auto_ptr容器的代码会编译报错,但是某些STL平台却没有完全禁止COAP,auto_ptr拷贝后可能产生错误的原因是当拷贝一个auto_ptr时,实际上它所指向的对象的所有权将被移交到拷入的auto_ptr上,自身被置为NULL,即拷贝一个auto_ptr意味着改变了它的值))
5,若存在继承关系,拷贝动作会导致剥离(slicing),即如果创建了一个存放基类对象的容器,却向其中插入派生类的对象,那么在派生类对象(通过基类的拷贝构造函数)被拷贝进容器时,它所特有的部分(即派生类中的信息)将会丢失(更多剥离问题,见第22,38条)
6,使拷贝动作高效,正确,并防止剥离问题发生的一个简单办法是使容器包含指针而不是对象,但指针也会有另外一些问题,见第7,33条,所以智能指针可能是个更好的选择
7,STL总的设计思想是为了避免不必要的拷贝,总体设计目标是为了避免创建不必要的对象