当你向容器中添加一个对象(比如通过insert或push_back等),进入容器的是你指定的对象的拷贝。当你从容器中获取一个对象时(比如通过front或back),你取到的是容器中那个对象的拷贝。拷进去,拷出来。这就是STL的方式。如果你从vector、string或deque中插入或删除,任何排序算法或它们的同类对象会移动(拷贝)。
因此,如果你用一个拷贝过程很昂贵对象填充一个容器,那么一个简单的操作——把对象放进容器也会被证明为是一个性能瓶颈。
由于继承的存在,拷贝会导致分割(slice)。那就是说,如果你以基类对象建立一个容器,而你试图插入派生类对象,那么当对象(通过基类的拷贝构造函数)拷入容器的时候对象的派生部分会被删除,一个使拷贝更高效、正确而且对分割问题免疫的简单的方式是建立指针的容器而不是对象的容器。
与数组据类型比较,reserve:
可以建立一个可以足够包含maxNumWidgets个Widget的空vector,但没有构造Widget。如:
vector<Widget> vw;
vw.reserve(maxNumWidgets);