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

咸宁住房和城乡规划建设局网站西安免费平台网站建设

咸宁住房和城乡规划建设局网站,西安免费平台网站建设,展示产品的网站,宁波网提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 目录 文章目录 前言 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 二、 list的模拟实现 ​编辑 三、 list与vector的对比 总结 前言 世上有两种耀眼的光芒一种是正在升起的太阳一种是正在努力学习编程的你!一个爱学编程的人。各位看官我衷心的希望这篇博客能对你们有所帮助同时也希望各位看官能对我的文章给与点评希望我们能够携手共同促进进步在编程的道路上越走越远 提示以下是本篇文章正文内容下面案例可供参考 一、list的介绍及使用 1.1 list的介绍 list的文档介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器并且该容器可以前后双向迭代。list的底层是双向链表结构双向链表中每个元素存储在互不相关的独立节点中在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似最主要的不同在于forward_list是单链表只能朝前迭代已让其更简单高效。与其他的序列式容器相比(arrayvectordeque)list通常在任意位置进行插入、移除元素的执行效率更好。与其他序列式容器相比list和forward_list最大的缺陷是不支持任意位置的随机访问比如要访问list 的第6个元素必须从已知的位置(比如头部或者尾部)迭代到该位置在这段位置上迭代需要线性的时间开销list还需要一些额外的空间以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素) 1.2 list的使用 list中的接口比较多此处类似只需要掌握如何正确的使用然后再去深入研究背后的原理已达到可扩展的能力。以下为list中一些常见的重要接口。 1.2.1 list的构造 构造函数constructor接口说明list (size_type n, const value_type val value_type())构造的list中包含n个值为val的元素list()构造空的listlist (const list x)拷贝构造函数list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list list的构造使用代码演示 1.2.2 list iterator的使用 此处大家可暂时将迭代器理解成一个指针该指针指向list中的某个节点。 函数声明接口说明begin  end返回第一个元素的迭代器返回最后一个元素下一个位置的迭代器rbegin  rend返回第一个元素的reverse_iterator,即end位置返回最后一个元素下一个位置的 reverse_iterator,即begin位置 【注意】 begin与end为正向迭代器对迭代器执行操作迭代器向后移动rbegin(end)与rend(begin)为反向迭代器对迭代器执行操作迭代器向前移动 1.2.3 list capacity 函数声明接口说明empty检测list是否为空是返回true否则返回falsesize返回list中有效节点的个数 1.2.4 list element access 函数声明接口说明front返回list的第一个节点中值的引用back返回list的最后一个节点中值的引用 1.2.5 list modifiers 函数声明接口说明push_front在list首元素前插入值为val的元素pop_front删除list中第一个元素push_back在list尾部插入值为val的元素pop_back删除list中最后一个元素insert在list position 位置中插入值为val的元素erase删除list position位置的元素swap交换两个list中的元素clear清空list中的有效元素 list的插入和删除使用代码的演示 list中还有一些操作需要用到时大家可参阅list的文档说明。 1.2.6 list的迭代器失效 前面说过此处大家可将迭代器暂时理解成类似于指针迭代器失效即迭代器所指向的节点的无效即该节点被删除了。因为list的底层结构为带头结点的双向循环链表因此在list中进行插入时是不会导致list的迭代器失效的只有在删除时才会失效并且失效的只是指向被删除节点的迭代器其他迭代器不会受到影响。 void TestListIterator1() {int array[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };listint l(array, array sizeof(array) / sizeof(array[0]));auto it l.begin();while (it ! l.end()){// erase()函数执行后it所指向的节点已被删除因此it无效在下一次使用it时必须先给其赋值l.erase(it);it;} }// 改正 void TestListIterator() {int array[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };listint l(array, array sizeof(array) / sizeof(array[0]));auto it l.begin();while (it ! l.end()){l.erase(it);// it l.erase(it);} } 二、 list的模拟实现 Test.cpp #define _CRT_SECURE_NO_WARNINGS 1 #includeiostream #includevector #includelist #includealgorithm using namespace std;void test_op1() {srand(time(0));const int N 1000000;listint lt1;listint lt2;vectorint v;for (int i 0; i N; i){auto e rand() i;lt1.push_back(e);v.push_back(e);}int begin1 clock();// vector用算法排序sort(v.begin(), v.end());int end1 clock();int begin2 clock();// list用自己的排序方法lt1.sort();int end2 clock();printf(vector sort:%d\n, end1 - begin1);printf(list sort:%d\n, end2 - begin2); }void test_op2() {srand(time(0));const int N 1000000;listint lt1;listint lt2;for (int i 0; i N; i){auto e rand();lt1.push_back(e);lt2.push_back(e);}int begin1 clock();// vectorvectorint v(lt2.begin(), lt2.end());// 用迭代器区间进行初始化相当于数据拷贝给vector// 让vector来排序sort(v.begin(), v.end());// lt2 再将数据拷贝回给listlt2.assign(v.begin(), v.end());int end1 clock();int begin2 clock();lt1.sort();// 直接排序int end2 clock();printf(list copy vector sort copy list sort:%d\n, end1 - begin1);printf(list sort:%d\n, end2 - begin2); } // //int main() //{ // test_op2(); // // return 0; //}#includelist.hint main() {bit::test_list3();return 0; } list.h #pragma once #includeassert.h// 原生指针是天然的迭代器前提是物理空间是连续的namespace bit {templateclass Tstruct ListNode{// 数据全部是公有的话可以用structListNodeT* _next;ListNodeT* _prev;T _data;ListNode(const T x T()):_next(nullptr), _prev(nullptr), _data(x){}};// typedef ListIteratorT, T, T* iterator;// typedef ListIteratorT, const T, const T* const_iterator;// 期望通过原生指针(Node*)来遍历链表但是每个节点在物理空间上的地址不连续没办法遍历// 而且解引用也拿不到节点对象中对应的数据。// 原生指针(节点的指针)不满足我们的预期所以我们用类将原生指针封装一下自定义类型可以重载运算符就可以掌控它的行为templateclass T, class Ref, class Ptr// Ref:Reference(引用) Ptr:pointer(指针)struct ListIterator{typedef ListNodeT Node;typedef ListIteratorT, Ref, Ptr Self;Node* _node;// 指针都是内置类型ListIterator(Node* node):_node(node){}// *it//T operator*()Ref operator*(){return _node-_data;}// it-//T* operator-()Ptr operator-(){return _node-_data;// 返回的是结构体A的地址}// itSelf operator(){_node _node-_next;return *this;}Self operator(int){Self tmp(*this);_node _node-_next;return tmp;}Self operator--(){_node _node-_prev;return *this;}Self operator--(int){Self tmp(*this);_node _node-_prev;return tmp;}bool operator!(const Self it){return _node ! it._node;}bool operator(const Self it){return _node it._node;}};//templateclass T//struct ListConstIterator//{// typedef ListNodeT Node;// typedef ListConstIteratorT Self;// Node* _node;// ListConstIterator(Node* node)// :_node(node)// {}// // *it// const T operator*()// {// return _node-_data;// }// // it-// const T* operator-()// {// return _node-_data;// }// // it// Self operator()// {// _node _node-_next;// return *this;// }// Self operator(int)// {// Self tmp(*this);// _node _node-_next;// return tmp;// }// Self operator--()// {// _node _node-_prev;// return *this;// }// Self operator--(int)// {// Self tmp(*this);// _node _node-_prev;// return tmp;// }// bool operator!(const Self it)// {// return _node ! it._node;// }// bool operator(const Self it)// {// return _node it._node;// }//};templateclass Tclass list{typedef ListNodeT Node;public://typedef ListIteratorT iterator;// 将迭代器的类型重命名为iterator不管迭代器是什么类型都不重要了// const的迭代器怎么搞呢// 1、单独搞一个const迭代器的类模板2、一个普通迭代器一个const的迭代器有点冗余了可以用一个模板参数来控制//typedef ListConstIteratorT const_iterator;typedef ListIteratorT, T, T* iterator;typedef ListIteratorT, const T, const T* const_iterator;// 方法一//iterator begin()//{// //return iterator(_head-_next);// return后面的代码就是一个匿名对象// iterator it(_head-_next);// iterator的构造函数(有名对象)// return it;//}// 方法二单参数的构造函数具有隐式类型转换// 普通的迭代器会被修改iterator begin(){return _head-_next;}iterator end(){return _head;}// const迭代器需要是迭代器(返回的是指针)不能修改还是迭代器指向的内容// 迭代器指向的内容不能修改const iterator不是我们需要const迭代器const修饰的是iterator(一个自定义类型)// T* const p1// const T* p2const_iterator begin() const{return _head-_next;}// 为什么const_iterator要加中间的下划线呢因为const iterator是使迭代器不能被修改不是我们需要的const迭代器。// 所以const的迭代器并不是在普通迭代器前面加上一个const而是创建了一个新的const_iterator类型。const_iterator end() const{return _head;}void empty_init(){_head new Node;_head-_next _head;_head-_prev _head;_size 0;}// 无参的构造函数list(){empty_init();}// lt2(lt1)list(const listT lt){empty_init();// 先搞一个哨兵位的头节点自己指向自己// 这里的e前面要加引用因为T有可能是string类型如果是string类型的话不加引用又是浅拷贝for (auto e : lt){push_back(e);}}// 需要析构一般就需要自己写深拷贝// 不需要析构一般就不需要自己写深拷贝默认浅拷贝就可以void swap(listT lt){std::swap(_head, lt._head);std::swap(_size, lt._size);}// lt1 lt3listT operator(listT lt){swap(lt);return *this;}// 清掉所有数据但是没有清掉头节点的数据void clear(){iterator it begin();while (it ! end()){it erase(it);}}~list(){clear();delete _head;_head nullptr;}/*void push_back(const T x){Node* newnode new Node(x);Node* tail _head-_prev;tail-_next newnode;newnode-_prev tail;newnode-_next _head;_head-_prev newnode;}*/void push_back(const T x){insert(end(), x);}void push_front(const T x){insert(begin(), x);}void pop_back(){erase(--end());}void pop_front(){erase(begin());}void insert(iterator pos, const T val){Node* cur pos._node;Node* newnode new Node(val);Node* prev cur-_prev;// prev newnode cur;prev-_next newnode;newnode-_prev prev;newnode-_next cur;cur-_prev newnode;_size;}iterator erase(iterator pos){Node* cur pos._node;Node* prev cur-_prev;Node* next cur-_next;prev-_next next;next-_prev prev;delete cur;_size--;return iterator(next);}size_t size() const{return _size;}bool empty(){return _size 0;}private:Node* _head;size_t _size;};void test_list1(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);// 不同的容器它们内部的迭代器的类型都是不同的listint::iterator it lt.begin();// 内嵌类型1、类部类2、typedef// iterator这个类型属于listint这个类域while (it ! lt.end()){*it 10;cout *it ;it;}cout endl;lt.push_front(10);lt.push_front(20);lt.push_front(30);for (auto e : lt){cout e ;}cout endl;lt.pop_back();lt.pop_back();lt.pop_front();lt.pop_front();for (auto e : lt){cout e ;}cout endl;}struct A{int _a1;int _a2;A(int a1 0, int a2 0):_a1(a1), _a2(a2){}};void test_list2(){listA lt;A aa1(1, 1);A aa2 { 1, 1 };// 多参数的构造函数也可以支持隐式类型转换lt.push_back(aa1);lt.push_back(aa2);lt.push_back(A(2, 2));lt.push_back({ 3, 3 });// 隐式类型转换lt.push_back({ 4, 4 });A* ptr aa1;(*ptr)._a1;ptr-_a1;listA::iterator it lt.begin();while (it ! lt.end()){//*it 10;// cout *it ;// 流插入不支持自定义类型如果想要流插入支持自定义类型// 1、自己写一个流插入的运算符重载2、数据是共有的// *it是调用operator*()函数返回的是A的对象//cout (*it)._a1 : (*it)._a2 endl;cout it-_a1 : it-_a2 endl;cout it.operator-()-_a1 : it.operator-()-_a2 endl;it;}cout endl;}void PrintList(const listint clt){listint::const_iterator it clt.begin();while (it ! clt.end()){//*it 10;cout *it ;it;}cout endl;}void test_list3(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);PrintList(lt);listint lt1(lt);PrintList(lt1);} } 三、 list与vector的对比 vector与list都是STL中非常重要的序列式容器由于两个容器的底层结构不同导致其特性以及应用场景不同其主要不同如下 vectorlist底 层 结 构动态顺序表一段连续空间带头结点的双向循环链表随 机 访 问支持随机访问访问某个元素效率O(1)不支持随机访问访问某个元素 效率O(N)插 入 和 删 除任意位置插入和删除效率低需要搬移元素时间复杂 度为O(N)插入时有可能需要增容增容开辟新空 间拷贝元素释放旧空间导致效率更低任意位置插入和删除效率高不 需要搬移元素时间复杂度为 O(1)空 间 利 用 率底层为连续空间不容易造成内存碎片空间利用率 高缓存利用率高底层节点动态开辟小节点容易 造成内存碎片空间利用率低 缓存利用率低迭 代 器原生态指针对原生态指针(节点指针)进行封装迭 代 器 失 效在插入元素时要给所有的迭代器重新赋值因为插入元素有可能会导致重新扩容致使原来迭代器失效删除时当前迭代器需要重新赋值否则会失效插入元素不会导致迭代器失效 删除元素时只会导致当前迭代器失效其他迭代器不受影响使 用 场 景需要高效存储支持随机访问不关心插入删除效率大量插入和删除操作不关心随 机访问 总结 好了本篇博客到这里就结束了如果有更好的观点请及时留言我会认真观看并学习。不积硅步无以至千里不积小流无以成江海。
http://www.pierceye.com/news/22777/

相关文章:

  • 电子商务网站推广可以做动画的网站都有哪些内容
  • 广西网站建设推广服务网站开发 英文
  • 互联网站备案信息查询保定seo外包服务商
  • 凡科网免费做网站做网站seo怎么赚钱
  • 简述网站建设优劣的评价标准中铁建设集团有限公司招标平台
  • 江苏商城网站建设服务网站seo自己怎么做
  • 中山祥云做的网站怎么样百度百科山东省城乡建设部网站
  • 养老保险网站网站加速优化
  • 浙江省住房和城乡建设厅网站 文件光辉网络 石家庄网站建设
  • 博客网站开发专门做网站的app
  • 武昌网站制作建设平面设计职业学校
  • 网站建设的费用结构房地产行业网站开发
  • 自助建站比较好的美食网站设计的基本思路
  • 百度整站优化app开发公司广州英诺
  • 建设电商网站的总结全自动网页制作系统源码
  • 95资料库邢台seo招聘
  • 龙江做网站河北做网站公司那家好
  • 网站根目录是哪里网页设计图片紧挨着
  • 网站登录系统制作谷歌play
  • 中英网站开发wordpress 常用 代码
  • 如何建设网站知乎赣州信息港手机版
  • 东莞网站搭建找哪里注册建筑劳务公司需要什么条件
  • 自己一个人做网站可以吗那个有那种网站
  • 国外什么推广网站好项目资源整合网
  • 专业设计网站排名免费建站系统对比
  • 视频网站开发的难点wordpress模板没反应
  • 北京网站优化公司哪家好浅析图书馆门户网站建设
  • wordpress最大的网站网站404页面模板
  • 网站排名易下拉系统如何做旅游网站的思维导图
  • 建设网站应注意些什么影视网站搭建哪个系统好