找百度公司做网站怎么样,网站建设的7种流程图,国外ip,搭建网页游戏服务器vecctor是动态顺序表
一、了解vector的相关接口及其功能
1.构造函数相关接口
函数声明功能介绍vector()无参构造vector(size_type n,const value_type valvalue_type())构造并初始化n个valvector(const value x)拷贝构造vector(InputIterator first, InputIterato…vecctor是动态顺序表
一、了解vector的相关接口及其功能
1.构造函数相关接口
函数声明功能介绍vector()无参构造vector(size_type n,const value_type valvalue_type())构造并初始化n个valvector(const value x)拷贝构造vector(InputIterator first, InputIterator last)使用迭代器进行构造
上面不认识的类型如size_type、value_type等都是被typedef过的可以根据英文意思直接理解或者找相关的文档进行查询
void test1()
{vectorint v;for (auto x : v){cout x ;}cout endl;vectorint v1(5, 2);for (auto x : v1){cout x ;}cout endl;vectorint v2(v1);//vectorint v2(v1.begin(),v1.end());和上一行代码等价for (auto x : v2){cout x ;}cout endl;string s hello world;vectorchar v3(s.begin(), s.end());//不同类型的迭代器也能初始化for (auto x : v3){cout x ;}cout endl;
} 2.vector iterator的使用
iterator的使用接口说明begin()end()获取第一个数据位置的iterator/const_iterator获取最后一个数据的下一个位置的iterator/const_iteratorrbegin()rend()获取第一个数据位置的reverse_iterator/const_reverse_iterator获取最后一个数据的下一个位置的reverse_iterator/const_reverse_iterator
void test2()
{vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vectorint::iterator it v.begin();//注意如果写类型名那么一定要写正确如加不加reverse、const一定要写对//如果不想写这么长的类型可以写auto自动类型推导while (it ! v.end()){cout *it ;it;}cout endl;vectorint::reverse_iterator it1 v.rbegin();while (it1 ! v.rend()){cout *it1 ;it1;}cout endl;
} 3.vector空间增长问题
函数名称接口说明size获取数据个数capacity获取容量大小empty判断是否为空resize改变vector的sizereserve改变vector的capacity
void test3()
{vectorint v;cout v.size() endl;cout v.capacity() endl;cout v.empty() endl;cout ---------- endl;vectorint v1(5, 2);cout v1.size() endl;cout v1.capacity() endl;cout v1.empty() endl;cout ---------- endl;//vectorint v2(v1);vectorint v2(v1.begin(),v1.end());cout v2.size() endl;cout v2.capacity() endl;cout v2.empty() endl;cout ---------- endl;string s hello world;vectorcharv3(s.begin(), s.end());cout v3.size() endl;cout v3.capacity() endl;cout v3.empty() endl;
} 结论构造函数创建对象时有多少个数据开多少空间
void test4()
{int arr[] { 1,2,3,4,5,6,7,8,9,10 };int n sizeof(arr) / sizeof(int);vectorint v(arr, arr n);//vector迭代器本质就是指针所以这里传指针没问题cout v.size() : v.capacity() endl;v.reserve(100);v.resize(20);cout v.size() : v.capacity() endl;v.reserve(50);v.resize(5);cout v.size() : v.capacity() endl;
} 结论resize控制size()的大小空间不够会扩容reserve申请预留的空间如果小于已经开出的空间capacity()则空间大小不变如果大于则会扩容至于扩多大的容主要看编辑器但是至少保证空间够用
4.vector的增删查改
函数名称接口说明push_back()尾插pop_back()尾删find查找vector没有find成员函数这个find是算法库中的如果找到findinsert在pos之前插入val返回新插入元素位置的迭代器erase删除pos位置的数据返回被删除元素的下一个元素位置的迭代器swap交换两个vector的数据空间operator[]像数组一样用下标访问数据
void test6()
{vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (int i 0; i v.size(); i){cout v[i] ;}cout endl;v.pop_back();for (int i 0; i v.size(); i){cout v[i] ;}cout endl;v.insert(v.begin() 1, 10);for (int i 0; i v.size(); i){cout v[i] ;}cout endl;v.erase(v.begin() 2);for (int i 0; i v.size(); i){cout v[i] ;}cout endl;auto itx find(v.begin(), v.end(), 10);//返回迭代器if (itx ! v.end())//没找到返回end()cout *itx;
} 5.迭代器失效重点
由于vector的迭代器底层是指针所以vector迭代器失效本质就是野指针问题
对于vector可能会导致其迭代器失效的操作有
1.在插入元素的过程中导致扩容而导致原本的空间被释放那么在扩容之前获取的迭代器就会失效这是一个例子其实只要引发扩容都可能导致迭代器失效
2.删除操作一般来说删除元素不会出现问题但是如果删除的元素是最后一个元素那么最后一个元素即被删除元素位置的迭代器就会失效
如果没看懂的可以看看后面对插入删除功能的模拟实现
以下代码的功能是删除vector中所有的偶数请问while循环的代码是正确的
void test7()
{vectorint v{ 1, 2, 3, 4 };auto it v.begin();while (it ! v.end()){if (*it % 2 0)v.erase(it);it;}while (it ! v.end()){if (*it % 2 0)v.erase(it);elseit;}while (it ! v.end()){if (*it % 2 0)it v.erase(it);elseit;}
}
很显然第一个while循环错误因为删除是将后面的元素整体往前移动所以删除完成之后it就已经指向了后一个元素不需要
而第二个while循环逻辑上没有问题但是不同的编辑器会有不同的结果在vs上编辑器会严格检查在可能导致迭代器失效的操作之后使用之前的迭代器直接报错而在g上就不会报错
第三个while循环才是标准的写法而这也是对迭代器失效问题的解决---为erase函数设置了返回值返回删除元素后面一个元素的迭代器这样就确保不会发生迭代器失效的问题了
二、模拟实现vector的基本功能
namespace zxws
{templateclass Tclass vector{public:// Vector的迭代器是一个原生指针typedef T* iterator;typedef const T* const_iterator;iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}// 构造和析构vector(){}vector(int n, const T value T()){reserve(n);while (n--) {push_back(value);}}templateclass InputIteratorvector(InputIterator first, InputIterator last){while (first ! last){push_back(*first);first;}}vector(const vectorT v){reserve(v.capacity());for (auto x : v){push_back(x);}}vectorT operator (vectorT v){swap(v);return *this;}~vector(){if (_start){delete[] _start;_start _finish _endOfStorage nullptr;}}// capacitysize_t size() const{return _finish - _start;}size_t capacity() const{return _endOfStorage - _start;}void reserve(size_t n){if (n capacity()){size_t 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;}}void resize(size_t n, const T value T()){if (n size()){reserve(n);for (size_t i size(); i n; i){_start[i] value;}}_finish n _start;}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){reserve(capacity() 0 ? 4 : capacity() * 2);}*_finish x;_finish;}void pop_back(){assert(size() 0);_finish--;}void swap(vectorT v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endOfStorage, v._endOfStorage);}iterator insert(iterator pos, const T x){assert(pos _start);assert(pos _finish);if (_finish _endOfStorage){size_t l pos - _start;reserve(capacity() 0 ? 4 : capacity() * 2);pos _start l;}iterator it _finish;while (it pos){*it *(it - 1);--it;}*pos x;_finish;return pos;}iterator erase(iterator pos){assert(pos _start);assert(pos _finish);iterator it pos;while (it _finish - 1){*it *(it 1);it;}_finish--;return pos;}private:iterator _start nullptr;// 指向数据块的开始iterator _finish nullptr; // 指向有效数据的尾iterator _endOfStorage nullptr; // 指向存储容量的尾};void test(){//vectorint v;vectorint v(10);vectorint v(10,2);//v.push_back(1);//v.push_back(2);//v.push_back(3);//v.push_back(4);//for (auto x : v)//{// cout x ;//}//cout endl;//vectorintv1(v);//for (auto x : v1)//{// cout x ;//}//cout endl;string s hello world;vectorchar s1(s.begin(), s.end());for (auto x : s1){cout x ;}cout endl;vectorchar s2;s2 s1;for (auto x : s2){cout x ;}cout endl;}void test1(){vectorstringv;v.push_back(11111111);v.push_back(11111111);v.push_back(11111111);v.push_back(11111111);v.push_back(11111111);v.push_back(11111111);v.push_back(11111111);v.push_back(11111111);v.push_back(11111111);for (auto x : v){cout x ;}cout endl;}void test2(){vectorint v;v.push_back(1);v.push_back(2);v.push_back(2);v.push_back(3);v.push_back(4);vectorint::iterator it v.begin();while(it!v.end()){if (*it % 2 0)it v.erase(it);elseit;}for (auto x : v){cout x ;}cout endl;v.pop_back();for (auto x : v){cout x ;}cout endl;}void test3(){vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.insert(v.begin()2, 0);v.insert(v.end(),0);for (auto x : v){cout x ;}cout endl;}
}
文章转载自: http://www.morning.nxbsq.cn.gov.cn.nxbsq.cn http://www.morning.llqky.cn.gov.cn.llqky.cn http://www.morning.fhxrb.cn.gov.cn.fhxrb.cn http://www.morning.sjzsjsm.com.gov.cn.sjzsjsm.com http://www.morning.hxftm.cn.gov.cn.hxftm.cn http://www.morning.ymyhg.cn.gov.cn.ymyhg.cn http://www.morning.fnpmf.cn.gov.cn.fnpmf.cn http://www.morning.crrjg.cn.gov.cn.crrjg.cn http://www.morning.langlaitech.cn.gov.cn.langlaitech.cn http://www.morning.wnxqf.cn.gov.cn.wnxqf.cn http://www.morning.tpnxj.cn.gov.cn.tpnxj.cn http://www.morning.dansj.com.gov.cn.dansj.com http://www.morning.fdzzh.cn.gov.cn.fdzzh.cn http://www.morning.xjwtq.cn.gov.cn.xjwtq.cn http://www.morning.tpkxs.cn.gov.cn.tpkxs.cn http://www.morning.ksgjy.cn.gov.cn.ksgjy.cn http://www.morning.rgpy.cn.gov.cn.rgpy.cn http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn http://www.morning.mjxgs.cn.gov.cn.mjxgs.cn http://www.morning.jbmbj.cn.gov.cn.jbmbj.cn http://www.morning.xkgyh.cn.gov.cn.xkgyh.cn http://www.morning.tnfyj.cn.gov.cn.tnfyj.cn http://www.morning.hctgn.cn.gov.cn.hctgn.cn http://www.morning.mcwrg.cn.gov.cn.mcwrg.cn http://www.morning.rbnj.cn.gov.cn.rbnj.cn http://www.morning.xlmgq.cn.gov.cn.xlmgq.cn http://www.morning.jbmsp.cn.gov.cn.jbmsp.cn http://www.morning.pshpx.cn.gov.cn.pshpx.cn http://www.morning.dkfb.cn.gov.cn.dkfb.cn http://www.morning.ptwzy.cn.gov.cn.ptwzy.cn http://www.morning.fksyq.cn.gov.cn.fksyq.cn http://www.morning.pdmc.cn.gov.cn.pdmc.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.nqcts.cn.gov.cn.nqcts.cn http://www.morning.bplqh.cn.gov.cn.bplqh.cn http://www.morning.c7623.cn.gov.cn.c7623.cn http://www.morning.mwqbp.cn.gov.cn.mwqbp.cn http://www.morning.nrjr.cn.gov.cn.nrjr.cn http://www.morning.shyqcgw.cn.gov.cn.shyqcgw.cn http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn http://www.morning.xxsrm.cn.gov.cn.xxsrm.cn http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn http://www.morning.jrqbr.cn.gov.cn.jrqbr.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.ftwlay.cn.gov.cn.ftwlay.cn http://www.morning.jzccn.cn.gov.cn.jzccn.cn http://www.morning.fhtmp.cn.gov.cn.fhtmp.cn http://www.morning.rxsgk.cn.gov.cn.rxsgk.cn http://www.morning.zhengdaotang.cn.gov.cn.zhengdaotang.cn http://www.morning.gwsdt.cn.gov.cn.gwsdt.cn http://www.morning.glkhx.cn.gov.cn.glkhx.cn http://www.morning.wmmtl.cn.gov.cn.wmmtl.cn http://www.morning.rqhbt.cn.gov.cn.rqhbt.cn http://www.morning.knqzd.cn.gov.cn.knqzd.cn http://www.morning.sfqtf.cn.gov.cn.sfqtf.cn http://www.morning.stbfy.cn.gov.cn.stbfy.cn http://www.morning.ccpnz.cn.gov.cn.ccpnz.cn http://www.morning.wqbhx.cn.gov.cn.wqbhx.cn http://www.morning.sjmxh.cn.gov.cn.sjmxh.cn http://www.morning.gmrxh.cn.gov.cn.gmrxh.cn http://www.morning.lrprj.cn.gov.cn.lrprj.cn http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn http://www.morning.rfxg.cn.gov.cn.rfxg.cn http://www.morning.ptdzm.cn.gov.cn.ptdzm.cn http://www.morning.rxwfg.cn.gov.cn.rxwfg.cn http://www.morning.dmkhd.cn.gov.cn.dmkhd.cn http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn http://www.morning.tzzkm.cn.gov.cn.tzzkm.cn http://www.morning.rfbq.cn.gov.cn.rfbq.cn http://www.morning.nkdmd.cn.gov.cn.nkdmd.cn http://www.morning.rggky.cn.gov.cn.rggky.cn http://www.morning.xqqcq.cn.gov.cn.xqqcq.cn http://www.morning.rzcbk.cn.gov.cn.rzcbk.cn http://www.morning.rfycj.cn.gov.cn.rfycj.cn http://www.morning.nbnpb.cn.gov.cn.nbnpb.cn http://www.morning.rsnn.cn.gov.cn.rsnn.cn http://www.morning.qpmwb.cn.gov.cn.qpmwb.cn http://www.morning.kjfqf.cn.gov.cn.kjfqf.cn http://www.morning.gfprf.cn.gov.cn.gfprf.cn http://www.morning.ykwqz.cn.gov.cn.ykwqz.cn