做一个网站放网上要多少钱,宁波软件开发公司排名,郑州网课老师,《网站开发实训》实验报告vector的介绍
此主题介绍转载自(https://cplusplus.com/reference/vector/vector/)
1.vector是一个表示可变大小数组的序列容器
2.vector同数组一样#xff0c;采用连续存储空间来存储元素#xff0c;这样可以用下标来对vector中的元素进行访问#xff0c;但是vector的大…vector的介绍
此主题介绍转载自(https://cplusplus.com/reference/vector/vector/)
1.vector是一个表示可变大小数组的序列容器
2.vector同数组一样采用连续存储空间来存储元素这样可以用下标来对vector中的元素进行访问但是vector的大小可以动态改变且可以其元素被容器vector自动处理。
3.从本质上讲vector使用动态分配数组来存储器元素当有元素插入的时候这个数组需要重新分配大小然后再将全部元素移入到这个数组里但是这个过程及其消耗时间所以为了解决这个问题vector并不会每次都重新分配大小。
vector的使用/用法
数组的创建
vector int v1;//创建一个整型数组v1
vector int v2(10,0);//初始化一个数组count nums 存放count个nums
vectorint v5(v4);//将v4中的元素拷贝给v5vector iterator 迭代器的使用
vectorint v3(v2.begin(),v2.end());//string类和vector类的的迭代器是互通的
string str(hello world);
vectorint v4(str.begin(), str.end());
vectorint v5(v4);vectorint::iterator it v4.begin();//同时也可以进行迭代器实现循环遍历
while (it ! v4.end())
{cout *it ;it;
}
cout endl;for (auto e : v5)
{cout e ;
}
cout endl;
vector空间增长相关函数
vectorint v;
v.reserve(100);//reserve改变的是capacity
v.resize(100);//reserve改变的是size 若仅开拓空间那么仍然不能使用v.size();//读取size
v.capacity();//读取capacity
vector的增删查改
vectorint v;
//尾插
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);//尾删
v.pop_back()//查找
auto itfind(v.begin(),v.end(),3);//first last dest(firts和last都是迭代器dest是查找的目标会返回查找目标的下标)//删除
it find(v.begin(),v.end(),3);
v.erase(it);//删除找到需要删除的数据的下标然后进行删除//清除数据
v.clear();//释放空间呢
v.shrink_to_fit();//同时也能按照数组下标去访问
for(int i0;iv.size();i)
{coutv[i]endl;
}vector类和string类的函数用法基本相同所以这里不作过多的解释用法也很简单详细可以参考(https://cplusplus.com/reference/vector/vector/) vector简要模拟
首先我们要知道vector实现的底层逻辑。找其源代码 可以知道其是进行指针的初始化模板命名重命名为 iterator T* iterator 大致模板
namespace an
{templateclass Tclass vector {public:typedef T* iterator;typedef const T* const_iterator;iterator begin()iterator end()vector(){}vector(size_t n,const T valT())vector(const vectorT v)void swap(vectorT v)vectorT operator(vectorT tmp)~vector()void reserve(size_t n)void resize(size_t n,const T valT())void push_back(const T x)T operator[](size_t pos)const T operator[](size_t pos) constsize_t capacity();size_t size();void insert(iterator pos, const T x)iterator erase(iterator pos)private:iterator _start;//原生指针,其实就是T* iterator _finish;iterator _endofstorage;};
}
初始化
vector():_start(nullptr),_finish(nullptr),_endofstorage(nullptr)
{}
~vector()
{delete[] _start;_start_finish_endofstoragenullptr;
}
获取大小/容量
size_t size() const
{return _finish-_start;//指针相减就是个数
}size_t capacity()const
{return _endofstorage-_start;
}
迭代器开头/结尾
iterator begin()
{return _start;
}
iterator end()
{return _finish;
}
开拓空间/重新定义空间
void reserve(size_t n)
{if(ncapacity){size_t szsize();T* tmpnew T[n];//扩容需要先开辟一个符合大小的空间然后再拷贝进去if(_start)//如果拷贝的空间内不为空{for(size_t i0;isz;i){tmp[i]_start[i];//由于是指针所以需要深拷贝memcpy仅能支持浅拷贝}delete[] _start;//清除空间} _starttmp;_finish_startsz;_endofstorage_startn;}
}void resize(size_t n,const T valT())
{if(nsize()) { _finish_startn;}else{reserve(n);while(_finish_startn) {*_finishval;_finish;} }
}
尾插
void push_back(const T x)
{if(_finish_endofstorage)//扩容里的代码也可以用reserve(capacity()0?4:capacity()*2)来代替{size_t szsize();size_t cpcapacity()0?4:22*capacity();T* tmpnew T[cp];if(_start!nullptr){memcpy(tmp,_start,sizeof(T)*size());delete[] _start;}_starttmp;_finish_startsz;_endofstorage_startcp;} *_finishx;//最后一个位置赋值_finish;//地址往后挪一位
}
下标引用读取
T operator[](size_t pos)
{assert(possize());return _start[pos];
}const T operator[](size_t pos)const
{assert(possize());return _start[pos];
}
随机位置插入/删除
void insert(iterator pos,const T x)
{assert(pos_start);assert(pos_finish);if(_finish_endofstorage){size_t lenpos-_start;reserve(capacity() 0 ? 4 : capacity() * 2);pos_startlen;//注意这里更新后的start指向的空间和原来的pos不一样需要进行更新}iterator end_finish-1;while(endpos){*(end1)*end;--end;}*posx;_finish;
}iterator erase(iterator pos)
{assert(pos_start);assert(pos_finish);iterator itpos1;while(it_finish){*(it-1)*it;it;}--_finish;return pos;//返回删除数据的下一个数据的位置
}
赋值重载/拷贝构造
vector(const vectorT v)
{reserve(v.capacity());for(auto e: v){push_back(e);}
}void swap(vectorT v)
{std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);
}
vectorT operator(vectorT tmp)
{swap(tmp);//有this指针直接作用于要作用的对象return *this;
}
迭代器初始化
templateclass InputIterator
vector(InputIterator first, InputIterator last)//迭代器初始化
{while (first ! last){push_back(*first);first;}
}
vector初始值初始化
vector(size_t n,const T valT())//n个数据去初始化
{reserve(capacity());for (size_t i 0; i n; i){push_back(val);}
}
//为了与迭代器的模板类型进行区分所以这里形参T加上了 符号
统一初始化
因为上述有多个构造函数为了简化代码不出现多个初始化列表所以在声明的时候就进行定义
private://原生指针,其实就是T* iterator _startnullptr;//指向数据的开始 iterator _finishnullptr;//指向数据的结束iterator _endofstoragenullptr;//指向空间位置的结束