任何特定的数据结构都是为了实现某种特定的算法,STL容器将运用最广的一些数据结构实现出来。
常用的数据结构包括array、list、tree、stack、queue、hash table、set、map.…等
根据数据在容器中的排列特性,将数据结构分为序列式和关联式两种:
vector的数据安排及操作方式和array很像,但array是静态空间,vector是动态空间。
vector所采用的数据结构是线性连续空间。
它以两个迭代器(也可理解为指针)start和finish指向已经使用部分的头和尾;
end_of_storage指向整块空间的尾端。
template <class _Ty, class _Alloc = allocator<_Ty>>
class vector{
...
protected:
pointer start;
pointer finish;
pointer end_of_storage;
};
运用迭代器实现功能:
class vector{
...
public:
//得到数组头的指针
iterator begin() {return start;}
//得到数组的最后一个单元+1的指针
iterator end() {return finish;}
//当前使用数据的大小
size_type size() const {return size_type(end() - begin());}
//当前vector分配的大小,区分于size
size_type capacity() const {return size_type(end_of_storage() - begin());}
//判断vector是否为空
bool empty() const {return begin() == end();}
//得到数组头的引用
reference front() {return *begin;}
//得到数组的最后一个单元的引用
reference back() {return *(end() - 1);}
};
一维数组
vector <int> v; //默认初始化
vector <int> v = {1,2,3,4,5};
vector <int> v(7); //v中将包含7个元素
vector <int> v(2,3); //v中将包含两个值为3的int
//拷贝初始化
vector <int> v(v1); OR vector <int> v = v1;
二维数组
vector <vector <int>> v;
vector <vector <int>> v(n, v0);
求二维数组的行列数:
vector<vector<int>> matrix//这是一个矩阵int
rows = matrix.size();//求得行数
col = matrix[0].size();//求的列数
vector提供许多constructors,其中一个允许我们指定空间大小及初值:
//构造函数,允许指定vector大小初值n和初值value
vector(size_type n,const T& value)
{
fill_initialize(n,value);
}
void fill_initialize(size_type n, const T& value){
start = allocate_and_fill(n,value);
finish = start + n;
end_of_storage = finish;
}
push_back : 在数组最后添加一个元素
void push_back(const T& x)
{
if(finish != end_of_storage){
++finish;
}
else
insert_aux(emd(),x); //插入函数的基础
}
所谓动态增加大小,并不是在原空间之后接续新空间,而是以原大小两倍另外配置一块较大空间,将原内容拷贝过来,释放原空间。
因此,对vector的操作一旦引起空间重新配置,指向原vector的迭代器就全部失效了。
emplace_back()和push_back()的区别:
功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素
emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。
push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);
emplace_back() 在实现时,则是直接*在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
//去掉数组的最后一个数据
void pop_back(){
--finish;
destory(finish);
//将尾端标记向前移动一格,放弃尾端元素
}
//清除(firat,last)中的所有元素
iterator erase(iterator first, iterator last);
//清除某个位置上的元素
iterator erase(iterator position);
//清除所有元素
void clear(); { erase(begin(),end());}
//在x的position前插入n
insert(iterator position, size_type n,const T& x);
参考来源:STL源码剖析