vector是一个单口容器,在尾部进行操作
vector类成员
vector类部分源码如下:
class vector{
protected:
iterator start;//表示目前空间的头
iterator finish;//表示目前使用空间的尾
iterator end_of_storage;//表示目前可用空间的尾
public:
iterator begin(){
return start;
}
iterator end(){
return finish;
}
size_type size() const{
return size_type(finish - start);
}
size_type capacity() const{
return size_type(end_of_storage - start)
}
reference operator[](size_type n){
return *(start + n);
}
reference front(){
return *start;
}
reference back(){
return *(finish - 1);
}
};
1. push_back
增加新元素时,若超过当时的可用容量,则会将容量扩充至两倍。这里需要注意的是:
- 动态增加大小,并不是再原来的空间后直接续接空间(因为无法保证原空间后面尚有足够的内容空间)
- 而是另外申请两倍于当前容量的空间,并将原来的元素拷贝到新的空间,并释放原有空间
- 因此,一旦vector扩充空间后,指向原vector的迭代器都会失效
源码如下:
void push_back(const T& x){
if(finish != end_of_storage){
//还有备用空间
construct(finish, x);
finish++;
}else{
//已无备用空间
insert_aux(end(), x); //容量扩充成原来的2倍
}
}
2. pop_back
将尾部元素拿掉,并调整大小
void pop_back(){
finish--; //将尾部标记前移一格,表示放弃尾端元素
destroy(finish);
}
3. erase
清除[first, last)中所有的元素
iterator erase(iterator first, iterator last){
iterator iter = copy(last, finish, first);
destroy(iter, finish);
finish = finish - (last - first);
return first;
}
清除某个位置上的元素
iterator erase(iterator position){
if(position + 1 != end()){
copy(position + 1, finish, position);
finish--;
destroy(finish);
return position;
}
}