vector定义与使用
使用前引用头文件 #include<vector>
类的源码:
class vector
{
protected:
iterator start; //目前使用空间的头
iterator finish; //目前使用空间的尾
iterator end_of_storage; //目前可用空间的尾
public:
//关于大小
size_type
size() { return size_type(finish-start); }
size_type
capacity() const { return size_type(end_of_storage); }
//基本操作
bool empty() { return start==finish; }
reference
operator[] (size_type n) { return *( start + n ); }
//关于构造函数、析构函数
vector() : start(0), finish(0), end_of_storagr(0) { }
vector( size_type n, const T& val) { ...... } //定义一个长度为n的vector容器,值全部初始化为val
~vector() { deallocate(); }
//常用函数实现 *:解引用操作符 start/finish/end_of_storage为迭代器(类似指针)
reference front() { return *start; }
reference back() { return *finish; }
//从后插入一个元素 当目前空间已满,系统会自动寻找一个更大的空间(两倍当前空间),将当前所有元素复制过去,并插入新元素后释放之前空间
void
push_back(const T& val) {
if(finish!=end_of_storage)
{
construct( finish, val );
++finish;
}
else
insert_aux( end(), val);
}
//删除最后一元素
void pop_back() { --finish; destory(finish); } // finish指向最后一个元素后的位置,finish要先-1,指向的才是要释放的位置
//清除某一位置上的元素 时间复杂度O(n) 返回指向删除元素后元素的迭代器
iterator
erase( iterator position ){
if ( position+1!= finish ){
copy( position+1, finish, position ); //后面元素前移
--finish;
destory(finish);
return position;
}
}
};
vector的数据结构:数组
vector元素的操作:pop_back、erase、clear、insert
pop_back() 略
erase
//清除[first, last) 中所有元素,并不删除last所指元素
iterator erase( iterator first, iterator last) {
iterator i=copy(last, finish, first); //O(n) 将后面元素前移
destory(i, finish);
finish=finish - ( last- first);
return first;
}
clear
void clear() {erase(start, finish); }
insert //从position开始插入n个值为val的元素
void insert(iterator position, size_type n, const T& val){
if(n!=0){
if(size_type(end_of_storage-finish)>=n){
//现将position及其后元素向后移n个位置,然后插入
}
else
//寻找更大的空间,等于当前空间的两倍,若还是放不下,则寻找足够大的空间,然后复制源数据,插入,释放原空间
}
}