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

优秀的电商设计网站有哪些内容苏州有哪些互联网企业

优秀的电商设计网站有哪些内容,苏州有哪些互联网企业,施工企业降本增效的方法和措施,沧州网站优化价格1、list介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是带头双向循环链表结构#xff0c;双向链表中每个元素存储在互不相关的独立节点中#xff0c;在节点中通过指针指向其前一个元素和后…1、list介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器并且该容器可以前后双向迭代。 2. list 的底层是带头双向循环链表结构双向链表中每个元素存储在互不相关的独立节点中在节点中通过指针指向其前一个元素和后一个元素。 3. list 与 forward_list 非常相似最主要的不同在于 forward_list 是单链表只能朝前迭代已让其更简单高效。 4. 与其他的序列式容器相比 (array vector deque) list 通常在任意位置进行插入、移除元素的执行效率更好。 5. 与其他序列式容器相比 list 和 forward_list 最大的缺陷是不支持任意位置的随机访问比如要访问 list的第6 个元素必须从已知的位置 ( 比如头部或者尾部 ) 迭代到该位置在这段位置上迭代需要线性的时间开销list 还需要一些额外的空间以保存每个节点的相关联信息 ( 对于存储类型较小元素的大 list 来说这可能是一个重要的因素) 2、list用法 list的接口有很多具体如下 具体用法可以查看 https://legacy.cplusplus.com/reference/list/list/?kwlist 下面我介绍一些常用的接口的用法 2.1 list的构造 构造函数constructor 接口说明 list (size_type n, const value_type val value_type()) 构造的 list 中包含 n 个值为 val 的元素 list() 构造空的 list list (const list x) 拷贝构造函数 list (InputIterator first, InputIterator last) 用 [first, last) 区间中的元素构造 list // list的构造 void TestList1() {listint l1; // 构造空的l1listint l2(4, 100); // l2中放4个值为100的元素listint l3(l2.begin(), l2.end()); // 用l2的[begin(), end()左闭右开的区间构造l3listint l4(l3); // 用l3拷贝构造l4// 以数组为迭代器区间构造l5int array[] { 16,2,77,29 };listint l5(array, array sizeof(array) / sizeof(int));// 列表格式初始化C11listint l6{ 1,2,3,4,5 };// 用迭代器方式打印l5中的元素listint::iterator it l5.begin();while (it ! l5.end()){cout *it ;it;} cout endl;// C11范围for的方式遍历for (auto e : l5)cout e ;cout endl; }2.2list iterator的使用 迭代器底层是使用指针实现的所以我们可以把迭代器当成一个指针指向list的某个结点。所有的容器的迭代器都被重命名为iterator 函数声明 接口说明 begin end 返回第一个元素的迭代器 返回最后一个元素下一个位置的迭代器 rbegin rend 返回第一个元素的 reverse_iterator, 即 end 位置 返回最后一个元素下一个位置的 reverse_iterator, 即 begin 位置 【注意】 1. begin 与 end 为正向迭代器对迭代器执行 操作迭代器向后移动 2. rbegin(end) 与 rend(begin) 为反向迭代器对迭代器执行 操作迭代器向前移动 //iterator void PrintList(const listint l) {for (listint::const_iterator it l.begin(); it ! l.end(); it){cout *it ;// *it 10; 这里是const_iterator it指向的内容不能被修改所以编译不通过}cout endl; }void TestList2() {int array[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };listint l(array, array sizeof(array) / sizeof(array[0]));// 使用正向迭代器正向list中的元素// listint::iterator it l.begin(); auto it l.begin(); while (it ! l.end()){cout *it ;it;}cout endl;// 使用反向迭代器逆向打印list中的元素// listint::reverse_iterator rit l.rbegin();auto rit l.rbegin();while (rit ! l.rend()){cout *rit ;rit;}cout endl; }2.3list 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 中的有效元素 void TestList1() {int array[] { 1, 2, 3 };listint L(array, array sizeof(array) / sizeof(array[0]));// 在list的尾部插入4头部插入0L.push_back(4);L.push_front(0);PrintList(L);// 删除list尾部节点和头部节点L.pop_back();L.pop_front();PrintList(L); }// insert /erase void TestList2() {int array1[] { 1, 2, 3 };listint L(array1, array1 sizeof(array1) / sizeof(array1[0]));// 获取链表中第二个节点auto pos L.begin();cout *pos endl;// 在pos前插入值为4的元素L.insert(pos, 4);PrintList(L);// 在pos前插入5个值为5的元素L.insert(pos, 5, 5);PrintList(L);// 在pos前插入[v.begin(), v.end)区间中的元素vectorint v{ 7, 8, 9 };L.insert(pos, v.begin(), v.end());PrintList(L);// 删除pos位置上的元素L.erase(pos);PrintList(L);// 删除list中[begin, end)区间中的元素即删除list中的所有元素L.erase(L.begin(), L.end());PrintList(L); }// resize/swap/clear void TestList3() {// 用数组来构造listint array1[] { 1, 2, 3 };listint l1(array1, array1 sizeof(array1) / sizeof(array1[0]));PrintList(l1);// 交换l1和l2中的元素listint l2;l1.swap(l2);PrintList(l1);PrintList(l2);// 将l2中的元素清空l2.clear();cout l2.size() endl; } 2.4list的迭代器失效 前面说过此处大家可将迭代器暂时理解成类似于指针迭代器失效即迭代器所指向的节点的无效即该节 点被删除了 。因为 list 的底层结构为带头结点的双向循环链表 因此 在 list 中进行插入时是不会导致 list 的迭代 器失效的只有在删除时才会失效并且失效的只是指向被删除节点的迭代器其他迭代器不会受到影响。 //这是一个模拟List的clear的实现 //这是错误写法 void clear() {iterator it begin();while (it ! end()){erase(it);it;} } //这段代码之所以错误主要是因为,it指向的那个结点已经被删除了所以it再是找不到后面节点的位置的。 /// //正确写法 void clear() {iterator it begin();while (it ! end()){iterase(it);//删除这个结点返回这个结点的下一个位置给it。} } 3、list的模拟实现 3、1node类模板 #includeiostream #includeassert.h using namespace std; namespace A { //用命名区间A把自己实现的list圈起来防止与库里面的混淆........ } 首先先构造出结点的类模板list_nodeT因为struct默认所有成员都是public我们需要在类外面使用list_node,所以这里使用struct。定义三个成员变量 _next下一个节点_pre上一个结点和数据data。 template class T struct list_node {typedef list_nodeT Node;Node* _next;Node* _pre;T _data;list_node(const T valT()):_next(nullptr),_pre(nullptr),_data(val){} }; 3、2迭代器类模板 l链表的物理结构并不是连续的它不像string、vector的结构对list进行时找不到它的下一个结点的。所以我们必须自己模拟出它的迭代器。 定义一个迭代器类模板在里面服用list_node类定义出迭代器的成员变量_node。在里面实现出我们需要用的运算符 templateclass T,class Ref,class Ptr struct __list_iterator {typedef list_nodeT Node;typedef __list_iteratorT,Ref,Ptr self;__list_iterator(Node* node):_node(node){}Node* _node;self operator(){_node _node-_next;return *this;}self operator(int){self tmp(*this);_node _node-_next;return tmp;}self operator--(){_node _node-_pre;return *this;}self operator--(int){self tmp(*this);_node _node-pre;return tmp;}Ref operator*(){return _node-_data;}Ptr operator-(){return _node-_data;}bool operator ! (const self s){return _node ! s._node;} }; 3、3list类模板 实现出list的迭代器我们就可以正式来模拟list接口了。 首先定义一个哨兵位结点这也是list类模板唯一的成员变量。在此我们复用list_node类模板和迭代器类模板然后我们实现list的各个接口 templateclass T class list {typedef list_nodeT Node;public:typedef __list_iteratorT,T,T* iterator;typedef __list_iteratorT,const T,const T* const_iterator;void init(){_head new Node;_head-_next _head;_head-_pre _head;}list(){init();}void clear(){iterator it begin();while (it ! end()){iterase(it);}}~list(){clear();delete _head;_head nullptr;}void swap(listT lt){std::swap(_head, lt._head);}list(const listT lt)//构造{_head new Node;_head-_next _head;_head-_pre _head;for (auto e : lt){push_back(e);}}listT operator(listT lt){swap(lt);return *this;}void push_back(const T x){Node* tail _head-_pre;Node* newnode new Node(x);tail-_next newnode;newnode-_pre tail;newnode-_next _head;_head-_pre newnode;}void push_front(const T x){insert(begin(), x);}iterator insert(iterator pos,const T x){Node* newnode new Node(x);Node* cur pos._node;Node* pre cur-_pre;pre-_next newnode;newnode-_pre pre;newnode-_next cur;cur-_pre newnode;return newnode;}iterator erase(iterator pos){assert(pos ! end());Node* cur pos._node;Node* pre cur-_pre;Node* next cur-_next;pre-_nextnext;next-_pre pre;delete cur;return next;}void pop_back(){erase(--end());}void pop_front(){erase(begin());}iterator begin(){return _head-_next;}iterator end(){return _head;}const_iterator begin() const{return _head-_next;}const_iterator end() const{return _head;} private:Node* _head; }; 上面就是list的常见接口的模拟实现有些并不常见的我没有在此写出原来如果以后见到的时候大家查一下List的文档就可以了使用方法都很简单。 4、list的优缺点 带头结点的双向循环链表 list这个容器常用于适合大量插入删除数据的场景由于它是一个个结点链接所以它移动节点会很方便并不需要挪动数据头插头删或者任意位置插入删除都很高效。但是它的缺点也很明显不支持随机访问访问某个元素效率O(N)底层节点动态开辟小节点容易造成内存碎片空间利用率低缓存利用率低。大家使用的时候注意能否适合使用List。
http://www.pierceye.com/news/310562/

相关文章:

  • 色流网站怎么做东营建筑信息网
  • 做能支付的网站贵吗网络安全工程师考证
  • 下载类网站开发条件环球资源网成立时间
  • 客户如何找到做网站宣传的律师免费虚拟主机空间
  • 点击网站出现微信二维码的链接怎么做网架制造厂
  • 服装网站建设环境分析一家专门做房产特卖的网站
  • 网站推广方式方法品牌建设的阶段和步骤是什么
  • 游戏开发平台seo的定义
  • 北京住房和城乡建设部网站官网可信赖的购物网站建设
  • 网站百度一直没有收录热狗网站关键词优化
  • 视频网站开发价格本地app开发公司电话
  • 网站设计风格介绍北京市建设工程信息网如何登录
  • 怎么创建一个属于自己的网站怎么制作做网站
  • 大学加强网站建设与管理的通知莱芜金点子租房信息港
  • 网站的营销与推广杭州五旋科技网站建设怎么样
  • 莱芜四中网站如何优化网站目录结构
  • 深圳公司网站设计哪家好北京装修公司十大排名
  • 如何制作一个好网站做国际网站找阿里
  • 南京制作网站wordpress网站源码上传
  • 做装修效果图的网站有哪些软件泉州营销型网站设计
  • 让路由器做网站服务器一级建造师价格最新行情
  • 白沟做网站wordpress批量编辑
  • 网站充值支付宝收款怎么做天元建设集团有限公司第七建筑工程公司
  • 定制家具网站源代码海口本地网站
  • 公司网站建设平台公司做网站开发流程
  • wordpress网站怎么打开很慢劳务派遣和外包一样吗
  • cms怎么搭建网站做装修的网站怎么做好
  • 个人网站建站的流程做网站一定要会ps么
  • 网站的数据运营怎么做国外做贸易网站
  • 网站全站开发需要学什么怎么样免费给网站做优化