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

洪梅仿做网站手机和pc合一的网站

洪梅仿做网站,手机和pc合一的网站,贵州省住房城乡建设厅网站,十堰做网站的有哪些目录 1.vector的介绍 2.vector常用的接口 1.vector构造 2.迭代器iterator的使用 3.vector空间增长 4.vector的增删改查 3.vector模拟实现 如果在reverse时使用memcpy会怎么样#xff1f; 1.vector的介绍 C中的vector是一个动态数组容器#xff0c;可以存储任意类型的…目录 1.vector的介绍 2.vector常用的接口  1.vector构造 2.迭代器iterator的使用 3.vector空间增长 4.vector的增删改查 3.vector模拟实现 如果在reverse时使用memcpy会怎么样 1.vector的介绍 C中的vector是一个动态数组容器可以存储任意类型的数据。它提供了动态大小的数组功能可以在运行时动态地增加或减少其大小。vector是C标准模板库STL中的一部分因此可以使用标准库中提供的许多函数和算法来操作它。 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样 vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问和数组一样高效。但是又不像数组它的大小是可以动态改变的而且它的大小会被容器自动处理。 3. vector 分配空间策略 vector 会分配一些额外的空间以适应可能的增长因为存储空间比实际需要的存 储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何重新分配都应该是 对数增长的间隔大小以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。 4. 与其它动态序列容器相比 deque, list and forward_list vector 在访问元素的时候更加高效在末 尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作效率比较低。 2.vector常用的接口  1.vector构造 1.vector();无参构造函数 2.vector(size_type n,const value_typevalvalue_type()); 构造一个包含 n 个元素的容器。每个元素都是 val  3.vector(const vectorx); 拷贝构造。 4.vector(InputIterator first,InputIterator last); 用迭代器进行初始化构造             2.迭代器iterator的使用 1.iterator begin(); 返回指向vector中第一个元素的迭代器。 2.iterator end(); 返回指向vector中最后一个元素下一个位置的迭代器。 3.reverse_iterator rbegin() 返回指向vector中最后一个元素位置的reverse_iterator 4.reverse_iterator end() 返回指向vector中第一个元素的前一个位置位置的reverse_iterator 3.vector空间增长 1.size_type size(); 返回数据个数 2.size_type capacity();  返回容量大小 3.bool empty(); 判断是否为空 4.resize函数 如果 n 小于当前容器大小则内容将减少到其前 n 个元素删除超出的元素并销毁它们。 如果 n 大于当前容器大小则通过在末尾插入任意数量的元素来扩展内容以达到 n 的大小。如果指定了 val则新元素将初始化为 val 的副本否则它们将初始化值。 如果 n 也大于当前容器容量则会自动重新分配分配的存储空间。 5.reverse函数 请求vector容量至少足以包含 n 个元素。 如果 n 大于当前向量容量则该函数会导致容器重新分配其存储从而将其容量增加到 n或更大。 在所有其他情况下函数调用不会导致vector容量不受影响。 capacity 的代码在 vs 和 g 下分别运行会发现 vs 下 capacity 是按 1.5 倍增长的 g 是按 2 倍增长的 。 reserve 只负责开辟空间如果确定知道需要用多少空间 reserve 可以缓解 vector增容的代价缺陷问题。 resize 在开空间的同时还会进行初始化影响 size。 4.vector的增删改查 1.push_back();尾插 2.pop_back();尾删 3.find();查找 find是算法模块实现不是vector的成员接口 templateclass InputIterator, class TInputIterator find (InputIterator first, InputIterator last, const T val) {while (first!last) {if (*firstval) return first;first;}return last; } 4.insert();插入 通过在指定位置的元素之前插入新元素来扩展vector从而有效地通过插入的元素数增加容器大小。 当且仅当新的vector大小超过当前vector容量时这会导致自动重新分配分配的存储空间。 由于vector使用数组作为其基础存储因此在vector以外的位置插入元素会导致容器将位置之后的所有元素重新定位到其新位置。与其他类型的序列容器如列表或forward_list对相同操作执行的操作相比这通常是一种低效的操作。 5.erase();删除 从向量中删除单个元素 或一系列元素 由于vector使用数组作为其基础存储因此擦除vector以外的位置的元素会导致容器在擦除段后将所有元素重新定位到其新位置。与其他类型的序列容器对相同操作执行的操作相比这通常是一种低效的操作  6.swap();交换 通过 x 的内容交换容器的内容x 是另一个相同类型的vector对象。尺寸可能有所不同。 调用此成员函数后此容器中的元素是调用之前位于 x 中的元素x 的元素是位于 this 中的元素。所有迭代器、引用和指针对交换的对象仍然有效。 3.vector模拟实现 #pragma once #includeassert.hnamespace wjc {template class Tclass vector{public:typedef T* iterator;typedef const T* const_iterator;vector(): _start(nullptr), _finish(nullptr), _endofstorage(nullptr){}vector(const vectorT v){reserve(v.capacity());for (const auto e : v){push_back(e);}}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}size_t capacity()const{return _endofstorage - _start;}size_t size()const{return _finish - _start;}void push_back(const T a){if (_finish _endofstorage){size_t newcapacity capacity() 0 ? 4 : capacity() * 2;reserve(newcapacity);}*_finish a;_finish;}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 oldsize size();T* tmp new T[n];if (_start){/*memcpy(tmp, _start, sizeof(T) * oldsize);*/for (size_t i 0; i oldsize; i){tmp[i] _start[i];}delete[] _start;}_start tmp;_finish _start oldsize;_endofstorage _start n;}}void resize(size_t n, T val T()){if (n size()){reserve(n);while (_finish _start n){*_finish val;_finish;}}else{_finish _start n;}}void pop_back(){assert(size() 0);--_finish;}void insert(iterator pos, T x){assert(pos _finish);assert(pos _start);size_t len pos - _start;if (_finish _endofstorage){reserve(capacity() 0 ? 4 : capacity() * 2);//pos ʧЧ//posλpos _start len;}memmove(pos 1, pos, (_finish - pos) * sizeof(T));*pos x;_finish;}void erase(iterator pos){assert(pos _finish);assert(pos _start);iterator it pos 1;while (it _finish){*(it - 1) *it;it;}_finish--;}T operator[](size_t pos){assert(pos, size());return _start[pos];}const T operator[](size_t pos)const{assert(pos, size());return _start[pos];}templateclass InputIteratorvector(InputIterator first, InputIterator last){while (first ! last){push_back(*first);first;}}private:iterator _start;iterator _finish;iterator _endofstorage;};}如果在reverse时使用memcpy会怎么样 1. memcpy 是内存的二进制格式拷贝将一段内存空间中内容原封不动的拷贝到另外一段内存空间中 2. 如果拷贝的是自定义类型的元素 memcpy 既高效又不会出错但如果拷贝的是自定义类型元素并且自定义类型元素中涉及到资源管理时就会出错因为memcpy 的拷贝实际是浅拷贝。 #includevector.h int main() {wjc::vectorstring v;v.push_back(1111);v.push_back(2222);v.push_back(3333);v.push_back(4444);v.push_back(5555);return 0; } 运行这段代码会出现问题因为插入4个元素后需要扩容但是memcpy只是将一段内存空间中内容原封不动的拷贝到另外一段内存空间中_start指向的空间已经释放了也就是野指针但是直到插入第5个元素_start依旧指向原来的空间vector释放空间会导致同一片空间释放两次。 所以如果对象中涉及到资源管理时千万不能使用memcpy进行对象之间的拷贝因为memcpy是浅拷贝否则可能会引起内存泄漏甚至程序崩溃。最好开辟新空间来拷贝如下面的方法 void reserve(size_t n){if (n capacity()){size_t oldsize size();T* tmp new T[n];if (_start){/*memcpy(tmp, _start, sizeof(T) * oldsize);*/for (size_t i 0; i oldsize; i){tmp[i] _start[i];}delete[] _start;}_start tmp;_finish _start oldsize;_endofstorage _start n;}}
http://www.pierceye.com/news/211646/

相关文章:

  • 国外免费外贸网站dw网页制作教程个人网站
  • 西安建设局网站地址室内设计效果图一套方案
  • php 建网站电子商务网站建设项目规划书
  • 常熟建设局网站代理办营业执照的公司
  • 济南网站关键词优化公司如何制作网站赚钱
  • 长春旅游网站开发360投放广告怎么收费
  • 微信公众号做网站卖东西静态化网站的缺点
  • 网站空间购买今天的新闻头条最新消息
  • 网站制作教程图解怎么解压wordpress
  • 唐山市城市建设规划局网站腾讯云建设一个网站要多少钱
  • 邢台集团网站建设费用聚牛建设网站
  • 如何创建电子商务网站学校网站设计首页
  • 扬州建设投资集团网站世界总人口实时数据
  • 沧州制作网站食品商务网-网站建设
  • 0592 网站建设模板网站建设+百度
  • 请人做个网站多少钱免费商城app
  • 网站建设包括哪些方面?手游源码网站
  • 机关门户网站建设管理情况软件开发工具都有哪些
  • 官方网站建设专家磐石网络wordpress对应的id
  • 学生自做网站优秀作品徐州企业建站模板
  • 网络电子商务购物网站idc机房建设
  • 网站单页seo个人服务器网站备案
  • 装修队伍做网站做机票在线预订网站
  • 手机版企业网站php山西建设执业注册中心网站
  • 南充网站建设略奥科技凡科建站电话
  • 个人网站可以做自媒体吗手机网站建设需要多少钱
  • 网站 模板网站什么英文字体
  • 北京市朝阳区住房建设网站图片在线编辑网站
  • 柳州市诚信体系建设网站网站数据库网络错误
  • 微站网站vps lnmp wordpress