vector 容器
vector 原意是向量。在C++中,是一种用起来像动态数组的模板类。在不同的编译器中,vector 的实现都不尽相同,侯捷老师主要介绍的是G2.9
和G4.9
两个版本。
//G2.9中 vector类的声明
template<class _Tp, class _alloc>
class vector{
...
protected:
iterator start;
iterator finish;
iterator end_of_storage;
};
vector . sizeof()
曾经有同学试图使用 sizeof()
来计算 vector 对象有多少个元素,可是得到的结果都是意料之外的 ( 因为他数组可能有十多个整形变量,但是sizeof()
得到的结果居然是 12 或者 24)。
从源码中可以看到vector的成员变量只有三个类型为 iterator 的迭代器对象,分别名为start
, finish
, end_of_storage
:
-
start
: 指向所有内存空间开始的地址 -
finish
: 指向所有内存空间使用的尾地址 -
end_of_storage
: 指向所有内存空间结束的尾地址
vector 对象通过三个指针管理使用的内存空间,而实际的数据并不存储在 vector 对象中。这也就是 sizeof()
得不到想要的数组内存大小的原因。
vector . 内存成长
vector 我们在使用的时候都知道它是一个动态数组,那么这个动态就体现在了可以动态地插入,动态地删除。那么 vector 对象控制的内存空间应该分配多少大小才能满足动态地插入呢?
答案是未知。因为我们并不知道会动态插入多少数组,因此最好的方法是 : 内存空间动态增长。
规则 :
vector<int> res; //默认构造 start == finish == end_of_storage 不分配内存空间
// 成长方式
else{
const size_type old_size = size();
const size_type len = old_size != 0 ? 2 * old_size : 1; //下方第三点规则
}
- 在
res.size() == 0