热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

20170326STL07_STL_SGI_list

list:1:SGISTL里面的list是一个双向链表,他的数据插入等操作比vector要高,他的存储在内存空间是非连续的&

list:

1:SGI STL里面的list是一个双向链表,他的数据插入等操作比vector要高,他的存储在内存空间是非连续的,通过指针将所有的节点连接起来。

2:由于存储空间不连续,list的迭代器需要另外实现。

struct _List_node_base {//用于指向节点的下一个节点和上一个_List_node_base* _M_next;_List_node_base* _M_prev;
};template
struct _List_node : public _List_node_base {//用于保存每个节点的数据_Tp _M_data;
};
struct _List_iterator_base {//迭代器基类typedef size_t size_type;typedef ptrdiff_t difference_type;typedef bidirectional_iterator_tag iterator_category;_List_node_base* _M_node;//创建一个节点,用于后期访问整个链表的数据_List_iterator_base(_List_node_base* __x) : _M_node(__x) {}_List_iterator_base() {}void _M_incr() { _M_node = _M_node->_M_next; }//访问下一个节点void _M_decr() { _M_node = _M_node->_M_prev; }//访问上一个节点bool operator==(const _List_iterator_base& __x) const {return _M_node == __x._M_node;}bool operator!=(const _List_iterator_base& __x) const {return _M_node != __x._M_node;}
}; template
struct _List_iterator : public _List_iterator_base {typedef _List_iterator<_Tp,_Tp&,_Tp*> iterator;typedef _List_iterator<_Tp,const _Tp&,const _Tp*> const_iterator;typedef _List_iterator<_Tp,_Ref,_Ptr> _Self;typedef _Tp value_type;typedef _Ptr pointer;typedef _Ref reference;typedef _List_node<_Tp> _Node;_List_iterator(_Node* __x) : _List_iterator_base(__x) {}_List_iterator() {}_List_iterator(const iterator& __x) : _List_iterator_base(__x._M_node) {}reference operator*() const { return ((_Node*) _M_node)->_M_data; }//取值#ifndef __SGI_STL_NO_ARROW_OPERATORpointer operator->() const { return &(operator*()); }//取值
#endif /* __SGI_STL_NO_ARROW_OPERATOR */_Self& operator&#43;&#43;() { //迭代器后移&#xff08;前&#43;&#43;&#xff09;this->_M_incr();return *this;}_Self operator&#43;&#43;(int) { //迭代器后移&#xff08;后&#43;&#43;&#xff09;_Self __tmp &#61; *this;this->_M_incr();return __tmp;}_Self& operator--() { this->_M_decr();return *this;}_Self operator--(int) { _Self __tmp &#61; *this;this->_M_decr();return __tmp;}
};
//部分方法实现iterator begin() { return (_Node*)(_M_node->_M_next); }//_M_node始终保存的是末尾的位置const_iterator begin() const { return (_Node*)(_M_node->_M_next); }iterator end() { return _M_node; }const_iterator end() const { return _M_node; }reverse_iterator rbegin() { return reverse_iterator(end()); }const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }reverse_iterator rend(){ return reverse_iterator(begin()); }const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); }bool empty() const { return _M_node->_M_next &#61;&#61; _M_node; }size_type size() const {size_type __result &#61; 0;distance(begin(), end(), __result);return __result;}size_type max_size() const { return size_type(-1); }reference front() { return *begin(); }const_reference front() const { return *begin(); }reference back() { return *(--end()); }const_reference back() const { return *(--end()); }void swap(list<_Tp, _Alloc>& __x) { __STD::swap(_M_node, __x._M_node); }iterator insert(iterator __position, const _Tp& __x) {//在中间位置插入元素_Node* __tmp &#61; _M_create_node(__x);//新建临时对象__tmp->_M_next &#61; __position._M_node;//修改临时对象下一个节点指向__tmp->_M_prev &#61; __position._M_node->_M_prev;//修改临时对象前一个指向__position._M_node->_M_prev->_M_next &#61; __tmp;//修改原来这里的节点__position._M_node->_M_prev &#61; __tmp;return __tmp;}iterator insert(iterator __position) { return insert(__position, _Tp()); }

iterator erase(iterator __position) {//擦除&#xff0c;和上面一样&#xff0c;直接把此元素前后元素的指针指向改了&#xff0c;然后析构这个元素就可以_List_node_base* __next_node &#61; __position._M_node->_M_next;_List_node_base* __prev_node &#61; __position._M_node->_M_prev;_Node* __n &#61; (_Node*) __position._M_node;__prev_node->_M_next &#61; __next_node;__next_node->_M_prev &#61; __prev_node;_Destroy(&__n->_M_data);_M_put_node(__n);return iterator((_Node*) __next_node);}





推荐阅读
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • T15483.【清华集训2017模拟11.26】简单路径T25484.【清华集训2017模拟11.26】快乐树T35485.【清华集训2017模拟11.26】字符串T1结论题,结论很 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 在HTML布局中,即使将 `top: 0%` 和 `left: 0%` 设置为元素的定位属性,浏览器中仍然会出现空白填充。这个问题通常与默认的浏览器样式、盒模型或父元素的定位方式有关。为了消除这些空白,可以考虑重置浏览器的默认样式,确保父元素的定位方式正确,并检查是否有其他CSS规则影响了元素的位置。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • iOS 不定参数 详解 ... [详细]
  • 本文探讨了Go语言中iota关键字的具体含义及其在常量声明中的应用。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
author-avatar
中国中国NO1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有