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

网站建设与制作好学吗响应的网站

网站建设与制作好学吗,响应的网站,公司网站建设 意义,wordpress模板双响目录 前言1. vector介绍及使用1.1vector的介绍1.2 vector的使用1.2.1 构造函数 1.2.2 vector对象遍历1.2.3 reserve和resize1.2.4 insert和erase 2. vector模拟实现2.1 vector迭代器失效问题2.2 模拟实现reserve函数浅拷贝问题2.3模拟实现源码2.3.1 vector.h2.3.2 test.cpp 前言… 目录 前言1. vector介绍及使用1.1vector的介绍1.2 vector的使用1.2.1 构造函数 1.2.2 vector对象遍历1.2.3 reserve和resize1.2.4 insert和erase 2. vector模拟实现2.1 vector迭代器失效问题2.2 模拟实现reserve函数浅拷贝问题2.3模拟实现源码2.3.1 vector.h2.3.2 test.cpp 前言 这篇文章我们来学习一下STL容器里的vector我们先来学习一下它的使用然后对vector进行模拟实现。 1. vector介绍及使用 1.1vector的介绍 vector文档介绍 vector是一个大小可以更改的数组序列容器。 其实这里可以简单认为vector就是之前数据结构学的顺序表。 1.2 vector的使用 vector提供的接口跟string是非常相似的所以经过前面string的学习再学习vector成本降低了很多。 下面我们来介绍一下常用接口。 1.2.1 构造函数 首先看第一个 这个是用来传空间配置器的我们可以认为这个就是无参的构造函数构造一个空的vector。 注意 vector是一个类模板类模板实例化只能显式实例化即需要在类模板名字后跟然后将实例化的类型放在中即可。 类模板不是真正的类其实例化的结果才是真正的类。 这个就是支持用n个val构造一个vector对象。 这个就是支持迭代器区间构造也不难理解我们来给大家演示一下 这个就是拷贝构造了 1.2.2 vector对象遍历 vector也重载了[]这里可以使用for循环遍历 也可以使用迭代器也就是支持范围for 1.2.3 reserve和resize 首先我们来看一下vector的扩容机制 #include iostream #include vector using namespace std; int main() {// 测试vector的默认扩容机制size_t sz;vectorint v;sz v.capacity();cout making v grow:\n;for (int i 0; i 100; i){v.push_back(i);if (sz ! v.capacity()){sz v.capacity();cout capacity changed: sz \n;}}return 0; }这里g下是二倍扩 当我们知道需要多少空间直接用reserve把空间开好就可以减少频繁扩容的一个消耗。 确定知道需要用多少空间reserve可以缓解vector增容的代价缺陷问题。 我们再来看一下resize(): resize在开空间的同时还会进行初始化,当然如果传的n比size小那它还会删除多余的数据。 1.2.4 insert和erase 与string相比vector只支持我们去传迭代器和迭代器区间了 2. vector模拟实现 2.1 vector迭代器失效问题 会引起其底层空间改变的操作都有可能导致迭代器失效比如resize、reserve、insert、assign、push_back等。 出错原因 以上操作都有可能会导致vector扩容迭代器失效实际就是迭代器底层对应指针所指向的空间被销毁了而使用一块已经被释放的空间造成的后果是程序崩溃(即如果继续使用已经失效的迭代器程序可能会崩溃)。 这里我们举个简单的例子以下代码用于输出v1中所有偶数 int main() {vectorint v1;v1.push_back(1);v1.push_back(2);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.push_back(6);for (auto e : v1){cout e ;}cout endl;auto it v1.begin();while(it ! v1.end())//错误代码{if(*it % 2 0){v1.erase(it);}it;}// while (it ! v1.end())// {// if (*it % 2 0)// {// it v1.erase(it);// }// else// {// it;// }// } }这里程序会报错出现段错误。实际上这里是因为是因为erase删除pos位置元素后pos位置之后的元素会往前搬移他没有接收返回值而是一味的进行操作导致程序越界奔溃。 2.2 模拟实现reserve函数浅拷贝问题 这里主要出现错误的原因就是内部使用了memcpy来拷贝数据。 memcpy是内存的二进制格式拷贝将一段内存空间中内容原封不动的拷贝到另外一段内存空间中如果拷贝的是内置类型的元素memcpy既高效又不会出错 但如果拷贝的是自定义类型元素并且 自定义类型元素中涉及到资源管理时就会出错因为memcpy的拷贝实际是浅拷贝 我们这里以vector string 为例 2.3模拟实现源码 2.3.1 vector.h #includeiostream #includeassert.h using namespace std;namespace w {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(size_t n, const T val T()){resize(n, val);}vector(int n, const T val T()){resize(n, val);}// [first, last)templateclass InputIteratorvector(InputIterator first, InputIterator last){while (first ! last){push_back(*first);first;}}vector(){}vector(const vectorT v){_start new T[v.capacity()];//memcpy(_start, v._start, sizeof(T)*v.size());for (size_t i 0; i v.size(); i){_start[i] v._start[i];}_finish _start v.size();_endofstorage _start v.capacity();}void swap(vectorT v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);}vectorT operator(vectorT v){swap(v);return *this;}~vector(){if (_start){delete[] _start;_start _finish _endofstorage nullptr;}}void reserve(size_t n){if (n capacity()){size_t sz size();T* tmp new T[n];if (_start){//memcpy(tmp, _start, sizeof(T) * sz);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);while (_finish ! _start n){*_finish val;_finish;}}}void push_back(const T x){insert(end(), x);}void pop_back(){erase(--end());}size_t capacity() const{return _endofstorage - _start;}size_t size() const{return _finish - _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];}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;}iterator erase(iterator pos){assert(pos _start pos _finish);iterator it pos 1;while (it ! _finish){*(it - 1) *it;it;}--_finish;return pos;}private:iterator _start nullptr;iterator _finish nullptr;iterator _endofstorage nullptr;};}2.3.2 test.cpp #include vector.h void test_vector1(){w:: vectorint v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);for (auto e : v1){cout e ;}coutendl;for (size_t i 0; i v1.size(); i){v1[i];}for (auto e : v1){cout e ;}cout endl;}void test_vector2(){w ::vectorint v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.push_back(5);v1.push_back(5);v1.push_back(5);for (auto e : v1){cout e ;}cout endl;v1.insert(v1.begin(), 100);for (auto e : v1){cout e ;}cout endl;}int main() {test_vector2();return 0; }
http://www.w-s-a.com/news/70964/

相关文章:

  • 网站的ftp地址是什么江苏做网站
  • 宁波网站建设制作公司哪家好潍坊建公司网站
  • 云端网站建设php7 wordpress速度
  • 建站的公司中小企业网站建设报告
  • 上海高档网站建设网站设计入门
  • 德尔普网站建设做网站线
  • 宁波网站搭建定制非模板网站建设电子商务公司名称大全简单大气
  • 巴中哪里做网站推销网站的方法
  • wordpress建站动画网站宣传的手段有哪些?(写出五种以上)
  • 做么网站有黄医疗机构网站备案
  • 企业年金是1比3还是1比4北京厦门网站优化
  • 政务信息网站建设工作方案云南建设工程质量监督网站
  • 如何做一份企业网站免费的短视频素材库
  • 云脑网络科技网站建设咸阳软件开发
  • seo对网站优化网站更换程序
  • 网站建设放什么科目中小学生在线做试卷的网站6
  • 网站建设推广公司排名绥化建设局网站
  • 凡科做的网站为什么打不开苏州行业网站建设
  • 南昌定制网站开发费用微信小商店官网入口
  • 深圳网站建设费用找人做的网站怎么看ftp
  • 做网站cookie传值dedecms网站后台
  • 温州网站推广网站建设要学会什么
  • c 网站开发框架品牌策划方案范文
  • 儿童摄影作品网站多元网络兰州网站建设
  • 电脑上不了建设厅网站常德网站建设费用
  • 做单页免费模板网站最新办公室装修风格效果图
  • 中国铁路建设投资公司网站熊学军想开网站建设公司
  • 优化一个网站多少钱网站开发北京
  • html教学关键词优化价格
  • 黄冈论坛网站有哪些给wordpress首页添加公告栏