std::vector是顺序容器,当用erase成员函数删除一个迭代器指向的元素时,会自动移动(不是std::move)后面的元素到前面来,而迭代器的指向不变(如果是std::map、std::list这类关联型容器,迭代器会失效),并且不会回收内存(也就是capacity不会变)。当用swap成员函数跟自身的拷贝交换时,才能释放多余内存。
代码如下,自定义一个foo类以监视构造、赋值、复制、移动、析构等情况。
#include <iostream>
#include <vector>
class foo{
int a;
public:
foo(int x=0):a(x){std::cout<<a<<" is constructed\n";}
foo(foo &&from){a=std::move(from.a);std::cout<<a<<" is moved\n";}
foo(const foo& from){a=from.a;std::cout<<a<<" is copied\n";}
foo& operator=(const foo&from){
std::cout<<a<<" is assigned by "<<from<<"\n";
if(this == &from)return *this;
a=from.a;
return *