1. vector size 相关的接口:
与容器大小相关的函数有以下几个:
size() //返回当前元素个数
max_size() // 当前能存储元素的最多个数
capacity() // 容器在重新获得更多存储空间时,可以存储的元素总个数
reserve() //指定vector 预留多少个元素的存储空间 ,当reserve ()< capacity() 时没有动作
shrink_to_fit() //C++11新增接口,释放掉当前多余的capacity, 调用后 size() = capacity()
empty() // 判断当前vector 是否为空,等价于size() = 0;
2. vector 内存管理方式方式
2.1 vector容器为了获取快速的随机访问,元素必须在内存中连续存储。
2.2 为了避免每次增加或删除元素时都需要重新开辟存储空间, vector 实际分配的内存比当前需要的内存会多一些,即capacity() 一般会大于size()
2.3 vector 新增元素时, 若size 没有超出capacity, 则不需要重新分配空间
2.4 当size 超过capacity 时, capacity 一般会自动扩展为当前的2倍,或者也可以通过reserve() 来人工指定vector预留多少空间
2.5 默认空的vector capacity 为0,然后增加到1,然后增加的规律是2倍; 若有同感reserve() 制定初始大小,则在初始大小的基础上double
2.6 max_size() 反应了在特定机器上vector 对象理论上能存储元素个数的上限,maxsize: 1073741823
3. 当调用pop_back() 接口释放掉存储的元素时,std::vector 不会重新分配内存,减少capacity()
网上有的说法是,增加是double ,减少时每次减1/4, std::vector 是不会减少的
以下示例程序比较清晰的揭示了这个过程:
typedef vector<int> vectors;
void printVectInfo(vectors& ivec)
{
cout<<"size: "<<ivec.size()<<endl;
cout<<"maxsize: "<<ivec.max_size()<<endl;
cout<<"capacity: "<<ivec.capacity()<<endl;
cout<<endl;
}
int main(int argc, char* argv[])
{
vector<int> ivec;
printVectInfo(ivec);
for(vectors::size_type i= 0 ; i!= 50 ; ++i)
{
ivec.push_back(i);
printVectInfo(ivec);
}
return 0;
}
程序执行结果:
size: 0
maxsize: 107