1.STL:C++中的一个标准模板库,分为十个容器。
STL中的vector容器:
2.vector是一个矢量容器,是对数组进行包装之后的,功能和数组较为相似。
数组:分配的是静态空间。
vector:分配的是动态空间。
3.vector能够像容器一样存放各种类型的对象。
扩容:STL的vector每次扩充容量时,新的容量都是前一次的两倍。把之前的数据复制到新的数组中,再把之前的内存释放,这样就能减少内存的浪费.
4.vector完整代码:
#include<iostream>
template<typename T>
class Vector
{
public:
Vector() //构造函数
{
pvec = new T[1](); //第一次就开辟一个,之后不够就进行扩容
curlen = 0; //当前长度为0
totallen = 1; //将总长度设为1
}
bool IsEmpty() //判空 判空一般是对外的
{
return curlen == 0;
}
void push_back(T val) //尾插
{
if (IsFull()) //判满
{
resize();
}
pvec[curlen++] = val;
}
void pop_back() //尾出
{
if (IsEmpty())
{
return;
}
curlen--; //将最后一个值变得无效
}
void insert(int pos, T val) //按位置插入
{
if (pos <0 || pos > curlen)
{
return;
}
if (IsFull())
{
resize();
}
int index = curlen - 1;
for (index; index >= pos; index--)
{
pvec[index + 1] = pvec[index];
}
pvec[pos] = val;
curlen++;
}
void erase(int pos) //按位置删除
{
if (pos < 0 || pos > curlen)
{
return;
}
int index = pos;
for (index; index < curlen - 1; index++)
{
pvec[index] = pvec[index + 1];
}
curlen--;
}
~Vector() //析构
{
delete[] pvec;
pvec = NULL;
}
void Show()
{
for (int i = 0; i < curlen; ++i)
{
std::cout << pvec[i] << " ";
}
std::cout << std::endl;
}
public:
void resize(int size) //扩容,按自己意愿size扩容
{
T* pnewspace = new T[size]();
memcpy(pnewspace, pvec, curlen*sizeof(T));
delete[] pvec;
pvec = pnewspace;
totallen = size;
}
private:
bool IsFull() //判满一般是对内的
{
return curlen == totallen;
}
void resize() //以倍数扩容
{
T* pnewspace = new T[totallen * 2]();
memcpy(pnewspace, pvec, curlen*sizeof(T));
delete[] pvec;
pvec = pnewspace;
totallen *= 2;
}
private:
T* pvec;
int curlen; //当前元素的个数 下一个能插入元素的下标位置
int totallen;
};
int main()
{
Vector<int> vec;
for (int i = 0; i < 10; i++)
{
vec.push_back(i + 1);
}
vec.pop_back();
vec.insert(4, 40);
vec.erase(6);
vec.Show();
return 0;
}