当前位置: 首页 > news >正文

做网站后有人抢注品牌关键字广告文案策划

做网站后有人抢注品牌关键字,广告文案策划,wordpress禁主题,在北京做网站制作一个月多少钱目录 一、成员变量 二、构造函数 1.默认构造 2.拷贝构造 3.迭代器构造 4.使用n个值构造 5.赋值拷贝 三、析构函数 四、vector重要成员函数 1.size和capacity函数 2.reserve函数 3.resize函数 4.push_back函数 5.insert函数 6.erase函数 7.重载operator[] 一、成…目录 一、成员变量 二、构造函数 1.默认构造  2.拷贝构造 3.迭代器构造 4.使用n个值构造 5.赋值拷贝 三、析构函数  四、vector重要成员函数 1.size和capacity函数 2.reserve函数 3.resize函数 4.push_back函数 5.insert函数 6.erase函数  7.重载operator[] 一、成员变量 STL库里面vector的成员变量和string有一些不一样他的成员变量是用了迭代器 _start是数组起始位置 _finish是数据内容结束位置的下一个 _endofstorage是开辟的空间结束位置的下一个。 那么vector的迭代器是又是什么呢 vector使用了模版他可以适配各种类型他的迭代器就是这个模板类型的指针。 因为vector和string一样本质上就是数组开辟的空间在内存上是连续的因此使用指针当迭代器是在合理不过了。 二、构造函数 我们模仿一下STL里面的vector没有使用适配器。 1.默认构造  vector的默认构造很简单直接写上就好内容都可以不需要因为我们在成员变量哪里给到了初始值他会在初始化列表中自动调用因此这里可以不需要写初始化列表。 那么我们可以不可以不要下面这局代码呢    答案是不可以的因为我们后续还会写上其他的构造函数那么编译器就不会提供默认生成的构造函数了。那这样我们普通的一个代码  vectorint v  就会报错 vector() {} 2.拷贝构造 拷贝构造调用了push_back函数先开辟好空间防止后续再扩容后续尾插即可。 vector(const vectorT v) {reserve(v.capacity());for (auto e : v){push_back(e);} } 3.迭代器构造 这里使用了模板来处理因为我们不仅仅想使用vector迭代器去构造类对象我们还想使用其他类对象的迭代器去构造。也是利用尾插即可。 template class InputIterator vector(InputIterator first, InputIterator last) {while (first ! last){push_back(*first);first;} } 4.使用n个值构造 开辟n个空间并全部赋值为给到的val参数。 vector(int n, const T val T()) {resize(n, val); }vector(size_t n, const T val T()) {resize(n,val); } 这里为什么我们要重载呢一个写出int类型一个写成size_t类型 我们先不写上面的int重载下面这句代码使用n个val进行拷贝竟然报错了为啥会这样 48行有问题我们发现明明我想调用的是58行的拷贝构造为啥会到模板那里去 是因为此时所传的 10 和 1 都是int类型而下面那个是 size_t和 int 两个类型编译器认为你要用这个模板来初始化因此会调用生成 InputIterator为int的函数int类型去解引用那可不就报错了嘛为了让编译器认识两个整形我们就重载了vector使他能够知道我们的意思。 5.赋值拷贝 利用了很现代的写法参数我们不传就会拷贝构造一个临时对象这个临时对象刚好是我this需要的内容我直接和你swap一下你身上就有了我不要的内容了同时出了作用域你会析构我会引用返回就完成了赋值拷贝。 vectorT operator(vectorT v) {swap(_start,v._start);swap(_finish, v._finish);swap(_endofstorage, v._endofstorage);return *this; } 三、析构函数  easy直接delete[]  顺便置空即可。 ~vector() {delete[] _start;_start _finish _endofstorage nullptr; } 四、vector重要成员函数 1.size和capacity函数 由于我们成员变量都是迭代器(实现方式为指针)因此size()的大小和capacity()都可以用迭代器相减的方式得到。 size_t size() const {return _finish - _start; } size_t capacity() const {return _endofstorage - _start; } 2.reserve函数 reserve可以开辟空间n比现在的空间大才开辟比现在的空间小则不管不会删除数据。 如果需要开辟空间则会先new出新的空间把原有的数据数据拷贝到这个空间里再删除原有的数据同时对成员变量进行修改。 注意我们在拷贝的时候不能使用memcpy因为用memcpy拷贝如果类型为自定义类型就仅仅是浅拷贝浅拷贝会在开辟新空间的时候进行delete一旦delete新空间也被delete了。 这里我们选择了使用循环赋值因为自定义类型会调用他的赋值拷贝而他的赋值拷贝一般是深拷贝(只要写了的话)因此我们再扩容的时候就不会因为delete而发生错误了。 void reserve(size_t n) {if (n capacity()){size_t sz size();T* tmp new T[n];if (_start){//memcpy对自定义类型是浅拷贝//memcpy(tmp, _start, sz * sizeof(T));//循环赋值会调用自定义类型的赋值拷贝就是深拷贝for (size_t i 0; i sz; i){tmp[i] _start[i];}delete[] _start;}_start tmp;_finish _start sz;_endofstorage _start n;} } 3.resize函数 resize会改变vector的size()。 如果传的n要比size()小那么就变成这个长度。 如果n比size()大就要先看扩不扩容但是无论扩不扩容我们都可以直接调用reserve函数需要扩你就扩不需要也没啥影响后面在将你传过来的值赋值给还未初始化的空间。 注意在C中一切类型都算对象包括内置类型因此我们传参给到的默认参数为T()  就像一个类的默认构造一样。  void resize(size_t n,const T val T()) {if (n size()){_finish _start n;}else{reserve(n);for (size_t i size(); i n; i){_start[i] val;}_finish _start n;} } 4.push_back函数 push_back函数先判断空间满了没有满了就去扩容空间capacity()为0就给4不为0就给2倍。 然后再*_finish这里赋值_finish即可。 void push_back(const T x) {if (size() capacity()){size_t cp capacity() 0 ? 4 : capacity() * 2;reserve(cp);}*_finish x;_finish; } 5.insert函数 insert函数传的参数不是索引而是迭代器 只要有插入我们都得判断是否扩容由于这里传递的是迭代器(vector中是指针)扩容有可能是异地扩容因此地址会发生改变我们扩容前先记录一下pos相对于_start的位置扩容后再加上这个位置赋值给pos才对。 后续就是挪动数据挪动完赋值_finish最后要返回pos可以防止迭代器失效。 iterator insert(iterator pos,const T x) {assert(pos _start);assert(pos _finish);if (size() capacity()){size_t len pos - _start; //扩容后_start位置可能会发生改变了因此要记录pos的相对位置改变pos的值size_t cp capacity() 0 ? 4 : capacity() * 2;reserve(cp);pos _startlen;}iterator end _finish - 1;while (end pos){*(end 1) *end;end--;}*pos x;_finish;return pos; } 6.erase函数  erase比insert还要简单一点也是挪动数据方向不一样insert是从后往前数据往后挪动erase是从当前位置往后向前挪动数据。再_finish--最后返回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; } 7.重载operator[] 分为普通版本和const版本普通可读可写const只能读。 T operator[](size_t pos) {assert(pos size());return _start[pos]; } //不可修改 const T operator[](size_t pos) const {assert(pos size());return _start[pos]; } 最后附上总代码  vector.h #pragma once namespace kky {templateclass Tclass vector{public: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(const vectorT v){reserve(v.capacity());for (auto e : v){push_back(e);}}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(size_t n, const T val T())//{// resize(n,val);//}vectorT operator(vectorT v){swap(_start,v._start);swap(_finish, v._finish);swap(_endofstorage, v._endofstorage);return *this;}~vector(){delete[] _start;_start _finish _endofstorage nullptr;}size_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){//memcpy对自定义类型是浅拷贝//memcpy(tmp, _start, sz * sizeof(T));//循环赋值会调用自定义类型的赋值拷贝就是深拷贝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 val T()){if (n size()){_finish _start n;}else{reserve(n);for (size_t i size(); i n; i){_start[i] val;}_finish _start n;}}void push_back(const T x){if (size() capacity()){size_t cp capacity() 0 ? 4 : capacity() * 2;reserve(cp);}*_finish x;_finish;}iterator insert(iterator pos,const T x){assert(pos _start);assert(pos _finish);if (size() capacity()){size_t len pos - _start; //扩容后_start位置可能会发生改变了因此要记录pos的相对位置改变pos的值size_t cp capacity() 0 ? 4 : capacity() * 2;reserve(cp);pos _startlen;}iterator end _finish - 1;while (end pos){*(end 1) *end;end--;}*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;}T operator[](size_t pos){assert(pos size());return _start[pos];}//不可修改const T operator[](size_t pos) const{assert(pos size());return _start[pos]; }private:iterator _start nullptr;iterator _finish nullptr;iterator _endofstorage nullptr;};void test01(){vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (size_t i 0; i v.size(); i){cout v[i] ;}cout endl;for (auto e : v){cout e ;}}void test02(){vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.resize(10, 6);for (auto e : v){cout e ;}cout endl;v.insert(v.begin(), 30);for (auto e : v){cout e ;}cout endl;}void test03(){vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){cout e ;}cout endl;v.erase(v.begin());for (auto e : v){cout e ;}cout endl;v.erase(v.begin()2);for (auto e : v){cout e ;}}void test04(){vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);vectorint::iterator it v.begin();while (it ! v.end()){if (*it % 2 0){it v.erase(it);}else{it;}}for (auto e : v){cout e ;}}void test05(){vectorint v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);vectorint v2(v);for (auto e : v){cout e ;}cout endl;for (auto e : v2){cout e ;}cout endl;vectorint v3;v3.push_back(1);v3 v;for (auto e : v3){cout e ;}}void test06(){vectorint v(10, 1);for (auto e : v){cout e ;}cout endl;std::string s(123456);vectorint v1(s.begin(), s.end());for (auto e : v1){cout e ;}cout endl;}void test07(){vectorintv1(10, 1);vectorintv2(10, 2);v1 v2;for (auto e : v1){cout e ;}cout endl;} } test.cpp #include iostream using namespace std; #includecassert #includevector.h int main() {kky::test07();}
http://www.dnsts.com.cn/news/265207.html

相关文章:

  • 路由器做php网站吗510企业网站系统源码
  • 芭乐站长统计 网站统计设计公司企业愿景
  • 年终总结ppt模板免费下载网站网站优化 合同
  • 凡科网站备案在线网页制作系统小彬
  • 松江网站设计cmsv6官方免费下载
  • 常州网站建设段新浩简单的wordpress模板下载
  • 要学做游戏上什么网站学好怎样手机做网站教程
  • 网站建设电话营销做家纺的网站
  • 建视频网站系统吗南京网站建设润洽
  • 网站建设可行性方案模板wordpress读取速度慢
  • 摄影做网站网站建设与管理 ppt模板
  • 手机网站大全12345wordpress网页实时更新数据
  • 企业网站优化与推广做网站和优化的公司
  • 做网站从哪里做网站更新了域名如何找到
  • 网站的建设模式是指什么如何接推广的单子
  • 专业做网站哪家便宜网站建设洛阳
  • 帝国cms做门户网站小程序开发平台哪家产品好
  • 企业网站建设费在会计上怎么做好网络推广销售
  • 广东网站建设怎么选网站建设需要哪些技术人员
  • html5网站价格开设类似于京东商城这类购物网站
  • 网站做edi认证有用没公众号怎么开通申请
  • 织梦网站最新漏洞入侵建筑网校排行榜
  • 过年做那些网站致富wordpress指定分类文章作者时间
  • 开发中英文网站多少钱有什么免费做h5的素材网站
  • 建设网站图片素材c 做网站方便吗
  • 网站开发总监待遇企业差旅服务平台
  • 广州 营销型网站建设公司网页设计 站点
  • 个体可以做几个网站空间设计方案
  • 玉树电子商务网站建设哪家好建设银行广州分行网站
  • 小超人成都网站建设看济南新闻