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

一流专业建设网站网站建设建立好如何盈利

一流专业建设网站,网站建设建立好如何盈利,wikiesu wordpress,项目投资网目录 1、list的介绍 2、list常用接口函数 2.1 几个构造函数 2.1.1 构造函数的模拟实现 2.2 迭代器 2.2.1 迭代器的模拟实现 2.3 容量相关的函数 3、list的增删查改 3.1 插入insert 3.2 删除erase 3.3 头插、头删、尾插、尾删 4、list需要注意的点及功能完善 4.1 l…

目录

1、list的介绍

2、list常用接口函数

2.1 几个构造函数

2.1.1 构造函数的模拟实现

2.2 迭代器

2.2.1 迭代器的模拟实现

2.3 容量相关的函数

3、list的增删查改

3.1 插入insert

3.2 删除erase

3.3 头插、头删、尾插、尾删

4、list需要注意的点及功能完善

4.1 list迭代器失效问题

4.2 list的sort排序


1、list的介绍

list在底层是双向链表,能够进行动态内存分配,与其他容器相比,list的插入删除要更高效。

list的特性

1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2、list的底层是带头双向循环链表结构,在节点中通过指针指向其前一个元素和后一个元素。

3、与其他的序列式容器相比(array,vector,deque等),list通常在任意位置进行插入、移除元素的效率更高。

list的缺陷

list最大的缺陷是不支持任意位置的随机访问

list和vector一样也是类模板。


2、list常用接口函数

2.1 几个构造函数

函数声明函数说明
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<int> l1;
//用10个6初始化链表
list<int> l2(10, 6);
//拷贝构造
list<int> ll2(l2);vector<int> v{ 1,2,3,4 };
//用迭代器区间初始化链表
list<int> l3(v.begin(), v.end());

2.1.1 构造函数的模拟实现

无参构造

void empty_init()
{_head = new Node;_head->_next = _head;_head->_prev = _head;
}list()
{empty_init();
}

拷贝构造

list(const list<T>& lt)
{empty_init();for (const auto& e : lt){push_back(e);}
}

赋值构造

void swap(const list<T>& tmp)
{std::swap(_head, tmp._head);
}list<T>& operator=(const list<T> lt)
{swap(lt);return *this;
}

析构

void clear()
{iterator it = begin();while (it != end()){it = erase(it);}
}~list()
{clear();delete _head;_head = nullptr;
}

2.2 迭代器

可以暂时将迭代器理解成指针,这个指针指向list中的某个节点。

函数声明接口说明
begin + end返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin + rend返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置
vector<int> v1{ 5,3,10,26,9,22,12,24 };
list<int> l(v1.begin(), v1.end());auto it = l.begin();
while (it != l.end())
{cout << *it << " ";it++;
}

反向迭代

2.2.1 迭代器的模拟实现

与vector不同,list的迭代器不是一个原生指针,而是封装节点指针的类,因为用户只需要得到节点中的数据而不是整个节点。

vector随机访问可以支持像it+5,it[6]这样的形式,而list不能随机访问也就不能使用operator []来访问节点,仅支持++和--操作,这个++和--也不是指针的++和--,所以要把迭代器也封装成一个类,通过重载++、--和解引用等运算符来满足需求。

//先要封装一个结点类
template<class T>
struct ListNode
{ListNode<T>* _next;ListNode<T>* _prev;T _data;ListNode(const T& x = T()):_next(nullptr), _prev(nullptr), _data(x){}
};
//封装一个迭代器类
template<class T>
struct __list_iterator
{typedef ListNode<T> Node;typedef __list_iterator<T> self;Node* _node;__list_iterator(Node* x):_node(x){}self& operator++(){_node = _node->_next;return *this;}self operator++(int){//相当于__list_iterator<T> tmp(*this);self tmp(*this);_node = _node->_next;return tmp;}self& operator--(){_node = _node->_prev;return *this;}self operator--(int);//解引用重载T& operator*(){return _node->_data;}//T operator->(){return &_node->_data;}bool operator!=(const self& s){return _node != s._node;}bool operator==(const self& s);
};

迭代器的实现

const_iterator begin()const
{//这里是单参数类型支持隐式类型转换//return const_iterator(_head->_next);return _head->_next;
}const_iterator end()const
{return _head;
}iterator begin()
{return _head->_next;
}iterator end()
{return _head;
}

2.3 容量相关的函数

函数接口说明
empty检测list是否为空,是返回true,否则返回false
size返回list中有效节点的个数

这里个函数我们学会使用即可。

3、list的增删查改

访问头部和尾部数据

函数功能
front()取到头节点数据的引用
back()返回尾节点数据的引用

3.1 插入insert

iterator insert(iterator pos, const T& x)
{Node* cur = pos._node;Node* prev = cur->_prev;Node* newnode = new Node(x);prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;++_size;//这里是为了管理_sizereturn newnode;
}

3.2 删除erase

将待删除的节点的前后节点先保存起来,再删除pos出节点,将前后节点连接起来。

iterator erase(iterator pos)
{assert(pos != end());Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;--_size;return next;
}

3.3 头插、头删、尾插、尾删

//尾插
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());
}

4、list需要注意的点及功能完善

4.1 list迭代器失效问题

list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,pos指向的节点的,改变的只是连接关系,位置始终都是一个位置。

只有在删除时才会失效,这个位置的数据被删除后,连接关系被改变,此位置就不在原链表中了,此时失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

4.2 list的sort排序

由于list是带头结点的双向循环链表,而算法库中的sort底层是快排,需要传入随机访问迭代器,所以list并不能使用算法库的sort。那么list的sort是怎么一回事呢?

list中给了一个适合自己的sort,这个sort实质上是归并排序,但是直接使用这个sort比list的数据先push_back到vector中,再使用算法库的sort,排完序后再导入list中的三步还要慢。

所以我们通常不使用list自己的sort。


文章转载自:

http://LTUETFEj.pbzgj.cn
http://N1IoTl8M.pbzgj.cn
http://9OJlWL0T.pbzgj.cn
http://oRJVXOgj.pbzgj.cn
http://3wbdFPwC.pbzgj.cn
http://CZ37Io3u.pbzgj.cn
http://UfbbRHyZ.pbzgj.cn
http://JcmWnYUP.pbzgj.cn
http://QVTHKhJ4.pbzgj.cn
http://niFziLv6.pbzgj.cn
http://WdSKizhm.pbzgj.cn
http://a62ac5RE.pbzgj.cn
http://Edo0CERx.pbzgj.cn
http://Q9KZa9fb.pbzgj.cn
http://IcEcpFfV.pbzgj.cn
http://XFr9XJ1F.pbzgj.cn
http://0vt8ihLL.pbzgj.cn
http://koyw1oX9.pbzgj.cn
http://I7ImqpXz.pbzgj.cn
http://K1OzRJlM.pbzgj.cn
http://6LNmYZF4.pbzgj.cn
http://dCSjcCR9.pbzgj.cn
http://wslNR2Du.pbzgj.cn
http://JRGBZKT4.pbzgj.cn
http://MpibNWyk.pbzgj.cn
http://3pwAruwl.pbzgj.cn
http://qHGmrlVx.pbzgj.cn
http://gKhfVnuc.pbzgj.cn
http://7IcV2FXR.pbzgj.cn
http://OZfcEDSD.pbzgj.cn
http://www.dtcms.com/wzjs/726722.html

相关文章:

  • 网络营销软件网站wordpress导航菜单栏
  • 网站开发猪八戒企业网站模板php
  • 百度怎样建立一个网站四川明腾信息技术有限公司
  • 在网站文章锚文本怎么做用网站模板做网站
  • 营销型网站功能表口碑好的秦皇岛网站建设哪家好
  • 国外做的好看的网站设计国家建设工程信息网
  • 做衣服招临工在什么网站找免费网站制作软件
  • 商城网站制作费用我爱水煮鱼 wordpress
  • 林芝网站建设设计上海2021
  • 宫廷计有哪些网站开发的网站建设如何增加流量
  • 深圳住房建筑网站建个什么网站
  • 做旅游网站的目标上海手工活外发加工网
  • 建设网站必须要配置apache吗视频门户网站建设项目标书
  • 做那种类型的网站seo好wordpress配置文件
  • 做网站的时候宽高自己架设服务器做网站
  • 全网vip影视网站一键搭建农村建设商城网站的好处
  • 二手闲置平台网站怎么做怎样讲卖灯的网站做的好处
  • 开网店的步骤和流程一键优化下载
  • 中国空间站的意义wordpress the7安装教程
  • 网站建设方式天象集团ui培训
  • 怎么做论坛网站怎么开网店呢
  • 网站开发百灵鸟优化哪个网站亲子游做的好
  • 手机膜+东莞网站建设wordpress 文库插件
  • 网站如何更新维护域名备案
  • 网站建设开发费用入什么科目销售网站内容设计
  • 运动网站源码wordpress 自带主题
  • 网页制作淘宝网站建设网站的pv统计功能怎样做
  • 沈阳设计网站网站建设的企业
  • 网站推广优化排名教程专门做高仿的网站
  • 微信网站搭建价格建站系统主要包括