步步为营(八)常用数据结构(1)STL-List(双端链表)
2015-07-28 10:15
323 查看
额,这个真的有必要说么~~
链表是空间动态分配的,内存不连续,不能随机进行访问和储存的结构。
链表的存储方式注定了链表在查找时面临着O(n)的时间复杂度,虽然看起来不算很大,但是这是单次查找的复杂度,如果要进行稍微复杂一点的操作,复杂度便很可能会飙升到O(n^2),这个复杂度真的会死人的……
不过链表的优点也很明显,如果程序对随机存储(也可以理解为下标式操作)的效率要求不高,那么使用链表存储数据比用数组空间缩小了不少,而且插入、删除之类的操作也方便很多(复杂度O(1),简直不要太快)。因为如果你要删除一个元素,只需要修改元素左右两个结点的指针,然后释放空间就行了。
STL里有List容器,而且是一个带头节点的环状双向链表。这种结构对于有大量插入或删除操作的程序来说,效率提升很大。
同时注意,由于List不支持随机访问,所以STL的sort()函数不能对list使用,List容器自带了sort()方法。
下面附上list成员函数说明:
链表是空间动态分配的,内存不连续,不能随机进行访问和储存的结构。
链表的存储方式注定了链表在查找时面临着O(n)的时间复杂度,虽然看起来不算很大,但是这是单次查找的复杂度,如果要进行稍微复杂一点的操作,复杂度便很可能会飙升到O(n^2),这个复杂度真的会死人的……
不过链表的优点也很明显,如果程序对随机存储(也可以理解为下标式操作)的效率要求不高,那么使用链表存储数据比用数组空间缩小了不少,而且插入、删除之类的操作也方便很多(复杂度O(1),简直不要太快)。因为如果你要删除一个元素,只需要修改元素左右两个结点的指针,然后释放空间就行了。
STL里有List容器,而且是一个带头节点的环状双向链表。这种结构对于有大量插入或删除操作的程序来说,效率提升很大。
同时注意,由于List不支持随机访问,所以STL的sort()函数不能对list使用,List容器自带了sort()方法。
下面附上list成员函数说明:
constructor 构造函数 destructor 析构函数 operator= 赋值重载运算符 assign() 分配值 front() 返回第一个元素的引用 back() 返回最后一元素的引用 begin() 返回第一个元素的指针(iterator) end() 返回最后一个元素的下一位置的指针 rbegin() 返回链表最后一元素的后向指针(reverse_iterator or const) rend() 返回链表第一元素的下一位置的后向指针 push_back() 增加一元素到链表尾 push_front() 增加一元素到链表头 pop_back() 删除链表尾的一个元素 pop_front() 删除链表头的一元素 clear() 删除所有元素 erase() 删除一个元素或一个区域的元素(两个重载) remove() 删除链表中匹配值的元素(匹配元素全部删除) remove_if() 删除条件满足的元素(遍历一次链表),参数为自定义的回调函数 empty() 判断是否链表为空 max_size() 返回链表最大可能长度 size() 返回链表中元素个数 resize() 重新定义链表长度(两重载函数) reverse() 反转链表 sort() 对链表排序,默认升序 merge() 合并两个有序链表并使之有序 splice() 对两个链表进行结合(三个重载函数) 结合后第二个链表清空 insert() 在指定位置插入一个或多个元素(三个重载函数) swap() 交换两个链表(两个重载) unique() 删除相邻重复元素
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- 浅析STL中的常用算法
- STL区间成员函数及区间算法总结
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++实现简单的学生管理系统
- JavaScript数据结构和算法之图和图算法
- c++ STL容器总结之:vertor与list的应用
- Linux内核链表实现过程
- C++链表倒序实现方法
- C++在成员函数中使用STL的find_if函数实例
- C#通过链表实现队列的方法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture