上一篇我们讨论了vector的声明,接下来您将看到的是vector的接口和实现。
class vector {
public:
...
iterator begin() { return start; } //返回vetor的首
const_iterator begin() const { return start; } //只读访问
iterator end() { return finish; } //返回vector的末尾
const_iterator end() const { return finish; } //只读访问
reverse_iterator rbegin() { return reverse_iterator(end()); } //反向迭代器
const_reverse_iterator rbegin() const {
return const_reverse_iterator(end());
} //只读访问
reverse_iterator rend() { return reverse_iterator(begin()); } //反向迭代器
const_reverse_iterator rend() const {
return const_reverse_iterator(begin());
}
size_type size() const { return size_type(end() - begin()); } //size,vector的长度
size_type max_size() const { return size_type(-1); } //vector支持的最大长度,4294967295
size_type capacity() const { return size_type(end_of_storage - begin()); } //vector的当前 容量.表示当前的vector有多大的容量。
bool empty() const { return begin() == end(); } //判断vetor是否为空,实现保证这个函数永远是常量时间复杂度。判断vector为空间已用empty,不要用size()==0,因为size()有可能是线性时间复杂度。
reference operator[](size_type n) { return *(begin() + n); } // []操作符
const_reference operator[](size_type n) const { return *(begin() + n); } //只读
vector() : start(0), finish(0), end_of_storage(0) {} //默认构造函数
vector(size_type n, const T& value) { //初始化长度为n,每个值均为value的vetor
start = data_allocator::allocate(n); //vector的内存分配委托给allocator来实现
iterator first = start;
while(n--)
{
*first++ = value;
}
finish = start + n;
end_of_storage = finish;
}
vector(size_type n) { //初始化长度为n,每个值均为默认值的vector
start = data_allocator::allocate(n);
while(n--)
{
*first++ = T();
}
finish = start + n;
end_of_storage = finish;
}
vector(const vector<T /*, Alloc*/>& x) { //拷贝构造函数
start = data_allocator::allocate(x.end() - x.begin());
finish = start;
for(iterator i = x.begin(); i != x.end(); ++i )
{
*finish++ = *i;
}
end_of_storage = finish;
}
vector(const_iterator first, const_iterator last) { //迭代器构造函数
size_type n = 0;
distance(first, last, n); //判断first到last的距离
start = data_allocator::allocate(n);
finish = start;
for(iterator i = x.begin(); i != x.end(); ++i )
{
*finish++ = *i;
}
end_of_storage = finish;
}
~vector() { //vector的析构函数
destroy(start, finish); //调用每个元素的析构函数
deallocate(); //释放vector的内存
}
vector<T /*, Alloc*/>& operator=(const vector<T /*, Alloc*/>& x);
void reserve(size_type n) { //vector的reverse函数,主要是用作vector的扩容,增加vector的容量到 n所制定的大小。为了防止vector发生过多的插入拷贝,建议用此函数为vector申请足够大的容量
if (capacity() < n) {
const size_type old_size = size();
const iterator tmp = data_allocator::allocate(n);
uninitialized_copy(begin(), end(), tmp);
destroy(start, finish);
deallocate();
start = tmp;
finish = tmp + old_size;
end_of_storage = start + n;
}
}
reference front() { return *begin(); } //返回vector的第一个元素
const_reference front() const { return *begin(); } //
reference back() { return *(end() - 1); } //返回vector的最后一个元素
const_reference back() const { return *(end() - 1); }
void push_back(const T& x) { //vector的push_back,最常用的函数,想vector的末尾增加值
if (finish != end_of_storage) {
*finish = x;
++finish;
} else
insert_aux(end(), x); //如果vector容量已满,进行插入。
}
void swap(vector<T /*, Alloc*/>& x) { //交换两个vector的值.这个是很有效率的。常量时间交换。
::swap(start, x.start);
::swap(finish, x.finish);
::swap(end_of_storage, x.end_of_storage);
}
iterator insert(iterator position, const T& x) { //vector的插入函数
size_type n = position - begin();
if (finish != end_of_storage && position == end()) {
*finish = *position;
++finish;
} else
insert_aux(position, x); //vector的插入需要拷贝调整元素的位置,因而需要拷贝,效率低
return begin() + n;
}
iterator insert(iterator position) { return insert(position, T()); }
void insert (iterator position, const_iterator first,
const_iterator last);
void insert (iterator position, size_type n, const T& x);
void pop_back() { 弹出最后一个元素
--finish;
destroy(finish);
}
void erase(iterator position) { //删除vector的元素,删除最后一个值是常量时间,否则需要调整元素,重新拷贝,效率很低
if (position + 1 != end())
copy(position + 1, end(), position);
--finish;
destroy(finish);
}
void erase(iterator first, iterator last) {
vector<T /*, Alloc*/>::iterator i = copy(last, end(), first); //需要重新拷贝
destroy(i, finish); //删除需要删除的位置
finish = finish - (last - first);
}
void resize(size_type new_size, const T& x) { //调整vector的长度
if (new_size < size())
erase(begin() + new_size, end());
else
insert(end(), new_size - size(), x);
}
void resize(size_type new_size) { resize(new_size, T()); }
void clear() { erase(begin(), end()); } //清除vector的所有元素,实现保证这个是线性时间的,O(n).
}
vector的常用接口就说到这里了,大家可以仔细体会。
更多的代码,请到www.sgi.com/stl .