热门标签 | 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);}





推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
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社区 版权所有