做公司网站需要多长时间,宫免费网站,seo优化内容,centos 一键 wordpress我写我 不论主谓宾 可以反复错
#x1f308;vector的介绍 1.vector是表示可变大小数组的序列容器2.就像数组一样#xff0c;vector也采用的连续存储空间来存储元素#xff0c;也就是意味着可以采用下标对vector的元素进行访问#xff0c;和数组一样高效。但是又不像数组vector的介绍 1.vector是表示可变大小数组的序列容器2.就像数组一样vector也采用的连续存储空间来存储元素也就是意味着可以采用下标对vector的元素进行访问和数组一样高效。但是又不像数组它的大小是可以动态改变的而且它的大小会被容器自动处理3.本质讲vector使用动态分配数组来存储它的元素。当新元素插入时候这个数组需要被重新分配大小为了增加存储空间。其做法是分配一个新的数组然后将全部元素移到这个数组。就时间而言这是一个相对代价高的任务因为每当一个新的元素加入到容器的时候vector并不会每次都重新分配大小。4.vector分配空间策略vector会分配一些额外的空间以适应可能的增长因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何重新分配都应该是对数增长的间隔大小以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的5.因此vector占用了更多的存储空间为了获得管理存储空间的能力并且以一种有效的方式动态增长6.与其它动态序列容器相比deque, list and forward_list vector在访问元素的时候更加高效在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作效率更低。比起list和forward_list统一的迭代器和引用更好 模拟实现的时候这里是指针。
vector的构造与析构 那我们现在敲个构造和析构函数吧。 不需要任何初始化的构造用这种方法初始化size和capacity都是0后续需要插入就会扩容。这种初始化方式也是最容易实现的
模拟实现vector(){}
//因为vector类中的private成员中已经给了初始值如果不初始化会默认给的nullptr初始值。 两个参数第一个参数是size_t类型第二个参数是const T val T()T是模板10个空间都会被初始化为字符a
std::vectorchar v(10,a);
---
模拟实现vector(size_t n, const T val T()){resize(n, val);}
给你一个区间根据这个区间进行初始化当然这个区间要是迭代器类型
std::string a abcdef;
std::vectorchar v(a.begin(),a.end());
---
模拟实现templatetypename InputIteratorvector(InputIterator first, InputIterator last){while (first ! last){push_back(*first);first;}}//在这个构造函数中使用了两个模板参数typename InputIterator。这是因为区间可以用不同类型的迭代器进行表示例如可以是普通指针、容器的迭代器、自定义类型的迭代器等。这两个模板参数允许我们灵活地适应不同种类的迭代器并使用相应的逻辑来处理区间的元素。
当然还有一个构造函数这个构造函数是为了和第三个构造函数做一个区分当两个参数都是int类型的时候。
模拟实现
vector(int n, const T val T())
{resize(n, val);
}
//如果两个参数都是intC会自动的寻找与类型最匹配的构造函数这样找到的不是第三个构造函数是第四个因为InputIterator是一个迭代器类型与int类型不匹配不额外写一个就会出错。后面的函数实现后我会进行测试。
️析构
//析构~vector(){if (_start){delete[] _start;_start _finish _endofstorage nullptr;}} vector拷贝构造和赋值
️拷贝构造 //拷贝构造vector(const vectorT v){_start new T[v.capacity()];//开辟一个空间//memcpy(_start, v._start, sizeof(T)*v.size());for (int i 0; i v.size(); i){_start[i] v._start[i];}_finish _start v.size();_endofstorage _start v.capacity();} ️赋值 //赋值//v1v2//这里我用现代写法void swap(vectorT v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);}
用于交换的函数传参传的是一个临时变量会先执行构造函数然后将v和this进行交换再返回执行完之后会进行析构函数这个时候就会把临时变量给释放。vectorT operator (const vector v){swap(v);} begin和end(迭代器)
begin一个指向第一个元素的迭代器end一个指向最后一个元素的下一个位置的迭代器
typedef T* iterator;typedef const T*const_iterator;//begin和enditerator begin(){return _start;}iterator end(){return _end;}//上面可以改const_iterator begin()const{return _start;}const_iterator end()const{return _end;}//加const就不可以修改了 size和capacity //size和capacitysize_t size()const{return _finish - _start;}size_t capacity()const{return _endofstorage - _start;} empty和clear empty是一个判断是否为空的函数clear是用来清空容器数据的函数
//empty和clear/*empty是一个判断是否为空的函数clear是用来清空容器数据的函数*/bool empty(){return _start _finish;}void clear(){_start _finish nullptr;} reserve和resize
这两个都是扩容的函数具体作用和string里的一样。
reserve中的参数如果比capacity大就进行扩容如果比capacity小可不理会. //reservevoid reserve(size_type n){if (n capacity()){int sz size();T* tmp new T[n];if (_start){for (size_t i 0; i sz; i){tmp[i] _start[i];}delete[] _start;}_start tmp;_finish _start sz;_endofstorage _start n;}}
resize中的参数如果比capacity大则进行扩容并将扩容的部分赋值为val反之进行缩容也就是原地减小 //resizevoid resize(size_t n, const T val T()){if (n size()){_finish _start n;}else{reserve(n);while (_finsh ! _start n){*_finish val;_finish;}}} insert和erase
️insert 如果_finish_endofstorage那么就得扩容扩容之后是在新的空间进行的所以我们要保留pos的值防止迭代器失效的问题出现然后前一个值给后一个值。
iterator insert(iterator pos, const T x){assert(pos _start pos _finish);if (_finish _endofstorage){size_t len pos - _start;size_t newcapacity capacity() 0 ? 4 : capacity() * 2;reserve(newcapacity);// 解决pos迭代器失效问题pos _start len;}iterator end _finish - 1;while (end pos){*(end 1) *end;--end;}*pos x;_finish;return pos;}️erase //eraseiterator erase(iterator pos){assert(pos _start pos _finish);iterator it pos 1;while (it ! _finish){*(it - 1) *it;it;}--_finish;return pos;} 运算符重载[]
vector是一个顺序容器支持快速的访问也就是支持下标访问。
T operator[](size_t pos){assert(pos size());return _start[pos];}const T operator[](size_t pos) const{assert(pos size());return _start[pos];} 尾插尾删
️push_back和pop_back //尾插void push_back(const T x){/*if (_finish _endofstorage){size_t newcapacity capacity() 0 ? 4 : capacity() * 2;reserve(newcapacity);}*_finish x;_finish;*/insert(end(), x);}//尾删void pop_back(){erase(--end());} vector底层实现代码
#pragma once
#includeiostream
using namespace std;
#includestring
#includevector
#includealgorithm
#includeassert.hnamespace cl
{template class T // generic templateclass vector{public:typedef T* iterator;typedef const T*const_iterator;//begin和enditerator begin(){return _start;}iterator end(){return _finish;}const_iterator begin()const{return _start;}const_iterator end()const{return _finish;}//构造函数vector(){}vector(size_t n, const T val T()){resize(n, val);}template class InputIteratorvector(InputIterator first, InputIterator last){while (first ! last){push_back(*first);first;}}vector(int n, const T val T()){resize(n, val);}//拷贝构造vector(const vectorT v){_start new T[v.capacity()];//开辟一个空间//memcpy(_start, v._start, sizeof(T)*v.size());for (int i 0; i v.size(); i){_start[i] v._start[i];}_finish _start v.size();_endofstorage _start v.capacity();}//析构~vector(){if (_start){delete[] _start;_start _finish _endofstorage nullptr;}}//赋值//v1v2//这里我用现代写法void swap(vectorT v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);}vectorT operator (const vector v){swap(v);}//size和capacitysize_t size()const{return _finish - _start;}size_t capacity()const{return _endofstorage - _start;}//empty和clear/*empty是一个判断是否为空的函数clear是用来清空容器数据的函数*/bool empty(){return _start _finish;}void clear(){_start _finish nullptr;}//reservevoid reserve(size_t n){if (n capacity()){int sz size();T* tmp new T[n];if (_start){for (size_t i 0; i sz; i){tmp[i] _start[i];}delete[] _start;}_start tmp;_finish _start sz;_endofstorage _start n;}}//resizevoid resize(size_t n, const T val T()){if (n size()){_finish _start n;}else{reserve(n);while (_finish ! _start n){*_finish val;_finish;}}}//insert和eraseiterator insert(iterator pos, const T x){assert(pos _start pos _finish);if (_finish _endofstorage){size_t len pos - _start;size_t newcapacity capacity() 0 ? 4 : capacity() * 2;reserve(newcapacity);// 解决pos迭代器失效问题pos _start len;}iterator end _finish - 1;while (end pos){*(end 1) *end;--end;}*pos x;_finish;return pos;}//eraseiterator erase(iterator pos){assert(pos _start pos _finish);iterator it pos 1;while (it ! _finish){*(it - 1) *it;it;}--_finish;return pos;}T operator[](size_t pos){assert(pos size());return _start[pos];}const T operator[](size_t pos) const{assert(pos size());return _start[pos];}//尾插void push_back(const T x){/*if (_finish _endofstorage){size_t newcapacity capacity() 0 ? 4 : capacity() * 2;reserve(newcapacity);}*_finish x;_finish;*/insert(end(), x);}//尾删void pop_back(){erase(--end());}private:iterator _startnullptr;iterator _finishnullptr;iterator _endofstoragenullptr;};}我写我 不论主谓宾 可以反复错