容器的size是指它已经保存的元素的数量;而capacity则是在不分配新的内存空间的前提下它最多可以保存多少元素;
只有需要的内存空间超过当期容量,reserve才会去调整vector的容量;
如果需求小于等于当前容量,reserve什么也不做;
resize则是直接改变容器大小;
当前resize设置大小如果小于容器的大小,则容器后部的元素会被删除;
如果resize设置大于容器的大小,会将新元素添加到容器后部;
总之,由于该操作不改变元素数量,仅仅影响vector预先分配多大内存空间;
<vector>
using std::vector;
int main(int argc,char** argv)
{
vector<int> ivec;
for(int i=0;i<10;++i)
ivec.push_back(i);
std::cout<<"ivec::capacity="<<ivec.capacity()<<std::endl;
std::cout<<"ivec::size="<<ivec.size()<<std::endl;
ivec.reserve(10);
std::cout<<"ivec::capacity="<<ivec.capacity()<<std::endl;
std::cout<<"ivec::size="<<ivec.size()<<std::endl;
ivec.resize(5);
std::cout<<"ivec::capacity="<<ivec.capacity()<<std::endl;
std::cout<<"ivec::size="<<ivec.size()<<std::endl;
ivec.shrink_to_fit();
std::cout<<"ivec::capacity="<<ivec.capacity()<<std::endl;
std::cout<<"ivec::size="<<ivec.size()<<std::endl;
return 0;
}
输出结果为
一开始ivec中没有任何元素,插入10个元素后,vecror自动分配的容量是16,;
进行reserve操作,reserve(10)正好等于元素数量,所以预先分配空间不改变;
最后进行resize操作,将vector后5个元素删除了,只保留了前五个元素;
肯定有人要问,不需要vector预先保留空间怎么办?
很简单,c++11贴心的提供了shink_to_fit()来讲capacity减少到和size相同;
最后看图可知capacity和size都为5。