stl list原理和用法
来源:互联网 发布:网络作家笔名 编辑:程序博客网 时间:2024/05/22 13:31
List的节点
template <class T>struct __list_node{typedef void* void_pointer; void_pointer next; //型别为void*,也可以设为__list_node<t>*void_pointer prev;T data;};
List的迭代器
在Vector中如果进行插入和删除操作后迭代器会失效,List有一个重要的性质就是插入和接合操作都不会造成原有的List迭代器失效。而且,再删除一个节点时,也仅有指向被删除元素的那个迭代器失效,其他迭代器不受任何影响。下面来看看List迭代器的源码。
template<class T, class Ref, class Ptr>struct __list_iterator{ .... typedef bidirectional_iterator_tag iterator_category; //List的迭代器类型为双向迭代器 typedef __list_node<t>* link_type; // 这个是迭代器实际管理的资源指针 link_type node; // 迭代器构造函数 __list_iterator(link_type x) : node(x) {} __list_iterator() {} __list_iterator(const iterator& x) : node(x.node) {} // 重载operator *, 返回实际维护的数据 reference operator*() const { return (*node).data; } // 成员调用操作符 pointer operator->() const { return &(operator*()); } // 前缀自加 self& operator++() { node = (link_type)((*node).next); return *this; } // 后缀自加, 需要先产生自身的一个副本, 然会再对自身操作, 最后返回副本 self operator++(int) { self tmp = *this; ++*this; return tmp; }
List的迭代器实现了==,!=,++,–,取值和成员调用等操作,由于是存放在不连续的内存空间,所以并不支持vector那样的p+n的操作。
List的数据结构
List的数据结构个List的节点数据结构是分开定义的,SGI的List不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针,就能完整表现一个链表。
template <class T, class Alloc=alloc>class list{protected: typedef __list_node<t> list_node;public: typedef list_node* link_type;protected: // 只要一个指针便可表示整个环状双向链表 link_type node;....}
iterator begin() { return (link_type)((*node).next);}iterator end() { return node};
list构造时首先申请一个list_node节点,作为尾端的空白节点。list中node的值就是该list_node的地址。
List的操作和用法
构造函数
list<int> c0; //空链表 list<int> c1(3); //建一个含三个默认值是0的元素的链表 list<int> c2(5,2); //建一个含五个元素的链表,值都是2 list<int> c4(c2); //建一个c2的copy链表 list<int> c5(c1.begin(),c1.end()); ////c5含c1一个区域的元素[_First, _Last)
大小、判断函数
int size() const:返回容器元素个数 bool empty() const:判断容器是否为空,若为空则返回true
增加、删除函数
void push_back(const T& x):list元素尾部增加一个元素x void push_front(const T& x):list元素首元素钱添加一个元素X void pop_back():删除容器尾元素,当且仅当容器不为空 void pop_front():删除容器首元素,当且仅当容器不为空 void remove(const T& x):删除容器中所有元素值等于x的元素 void clear():删除容器中的所有元素 iterator insert(iterator it, const T& x ):在迭代器指针it前插入元素x,返回x迭代器指针 void insert(iterator it,size_type n,const T& x):迭代器指针it前插入n个相同元素x void insert(iterator it,const_iterator first,const_iterator last):把[first,last)间的元素插入迭代器指针it前 iterator erase(iterator it):删除迭代器指针it对应的元素,返回的是it下一个节点的迭代器 iterator erase(iterator first,iterator last):删除迭代器指针[first,last)间的元素,返回last
遍历函数
iterator begin():返回首元素的迭代器指针iterator end():返回尾元素之后位置的迭代器指针reverse_iterator rbegin():返回尾元素的逆向迭代器指针,用于逆向遍历容器reverse_iterator rend():返回首元素前一个位置的迭代器指针reference front():返回首元素的引用reference back():返回尾元素的
阅读全文
0 0
- stl list原理和用法
- (STL) list的简单用法和实现
- STL--list用法(一)
- STL--list用法(二)
- STL中list用法
- STL中list用法
- STL中list用法
- STL List用法
- STL:list用法详解
- STL之list 用法
- STL list用法总结
- [STL]list的用法
- STL:list用法详解
- STL list(全部用法)
- STL::List用法详解
- STL中list用法详解
- STL中list用法详解
- 顺序容器STL::list用法
- 初试图像拼接
- 鼠标点击 INPUT 元素后默认触发的事件执行顺序
- Java并发同步
- hadoop常用的命令
- [Zabbix] Agent 安装
- stl list原理和用法
- 结构体初始化 initializer element is not constant
- UmBasketella(三分算法解决单峰问题)
- git/gerrit 常用命令记载
- 「とても」「あまり」「大変」的用法区别
- cocos2d-x3.2 24种基本特效
- 本文主要阐述了四种排序方法
- 腾讯开源ncnn:Ubuntu下运行示例
- windows下gem install报certificate verify failed错误解决办法或者添加淘宝源镜像失败