STL中list学习

原创 2013年12月05日 21:23:57

list 是一个双向链表容器,完成了标准的C++数据结构中链表的所有功能。list与vector和deque类似,只不过中中的对象提供了对元素的随机访问。它不支持访问的数组类型,因为STL以双向链表的方式实现list对象,所以访问链表元素需要指针从链表的某个端点开始。插入和删除操作的时间是固定的,也就是说,list对象插入和删除一个元素所需要的时间与该元素在链表中的位置无关。
list由双向串行(doubly linked list)实作而成。这意味着list内的每一个元素都以一部分内存指示其前导元素和后继元素。list不提供随机存取,因此,如果你要存取第10个元素,你必须沿着串链,依次走过前9个元素。不过,移动至下一个元素或前一个元素的行为,可以在常数时间内完成。因此一般的元素存取动作将话费线性时间(平均距离与元素数量成比例)。这比vector和deque提供的分摊性(amoritzed)常数时间,性能相差很多。
list的优势是任何位置执行插入或删除动作都非常迅速,因为所需改变的只是连接(lists)而已。这表示在list中移动一段元素比在vector和deque中都快很多。从以上的阐述可以看出,list对象在序列中的任何位置放置和删除元素都是高效的,list对象在需要的时候可以看出其自身的大小。
创建list对象的四中方法:
1.list<A> name; 2. list<A> name(size); 3. list<A> name(size, value); 4. list<A> name(first, last);
list访问:
假如现在需要访问容器中的元素,不可以at函数进行直接操作,因为list并不像vector和deque一样,提供了at函数。另外,list也没有提供operator[]操作运算符,所以它对中间元素的访问非常不方便,只能通过迭代器技术。
list重置技术:在list中提供了内容重置的可能,通过函数assign可以很方便地重置list中的某个具体值,也可以是一段连续的内容。
容器内容交换:在list中提供了成员函数swap进行两个list变量的交换操作,也就是说通过swap函数可以完成两个list变量的相互内容交换。
list插入和删除技术:和其它容器一样,list容器也提供了丰富而又灵活的插入和删除操作。和vector容器比较,list可以在list队列的末尾和开头高效和灵活地插入和删除元素。在list中主要提供了以下几种方法和函数:
push_back()、push_front():把某个值插入到list的尾部或者头部。
pop_back()、pop_back():删除list中的第一个或者最后一个元素。
insert():这个方法即可以把某个元素插入到指定的位置,也可以把一个指定范围的多个元素插入到list中迭代器所指向的位置,另外还可以把某个具体的多个备份插入到list中迭代器所指定的位置。
erase():主要用来删除list中的元素,即可以删除list中某个位置的单个元素,也可以删除list中的某个范围内的所有元素对象。
clear():该函数主要用来删除list中的所有元素。
list特殊函数
和vector和deque两种容器相比,除了具有以上相同的函数和操作运算符外,list还具有merge()函数,remove()函数,remove_if()函数,sort()函数,splice()函数和unique()函数。
merge()函数:用于把两个list对象合并成一个list对象。

remove()函数:删除list中的对象可以使用pop_back(),pop_front(),erase()和clear()等常见函数,在list中同时提供了remove()函数,函数remove()的语法格式为void remove(const T& value)

remove会把list对象中所有等于参数的元素删除。如果list存储的是类,且类中有指针,由于remove不会自动删除类的存储空间,所以一般不能用remove方法对类元素直接删除。

remove_if():remove()函数用于无条件删除所有等于参数值的list成员元素,有时需要满足一定的条件才能把它删除,这时需要使用条件删除函数:remove_if(),函数remove的语法格式为templace<class Pred>void remove_if(Pred pr)

sort()函数:偏于list对象排序,在list成员函数中专门定义了一个成员函数sort,用于对list对象进行排序,函数sort的语法格式为void sort(); void sort(greater<T> pr)

splice()函数:merge()函数可以将两个list对象合并在一起,但是该函数不太灵活,list容器类提供了另一个函数splice。格式为void splice(iterator position, list& x); void splice(iterator position, list& x, iterator it); void splice(iterator position, list& x, iterator first, iterator last)

从上面的定义中可以看出,两个list并没有改变大小,只是把一个list中的对象移到另一个list对象中而已。

unique()函数:为了保持list中存储的元素连续两个对象具有唯一性,即要求list中的任意连续对象元素值是不同的,这时可以使用函数unique。格式为void unique(); void unique(not_equal_to<T> pr)

从unique函数的定义可知unique并不能保证list对象中的值具有唯一性。

C++STL学习(3)容器list

注:博客内容均来自于对《C++标准库》侯捷,华中科技大学出版社一书的笔记。转载请注明出处。 1、list list使用一个双向链表(doubly linked list)来管理元素。 2、...

STL学习——list中的sort算法

STL源码剖析中给出了list的sort算法的源码 ,感觉是合并排序算法,觉得很经典: Template void list::sort() { if(node->next == node ...
  • wendll
  • wendll
  • 2012年06月16日 13:33
  • 277

C++ STL容器的学习使用(vector、queue、list、set、map)

 1.STL组成: STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(containeradaptor),函数对象(fun...

今日学习札记——STL常用容器:vector、list、set和multiset、map和multimap(11.17)

1.vector,头文件#include (1) 声明方法:vector 变量; 范例: int main() {     vector IntArray(3); IntArray[0]...

stl学习之2 list

#pragma once#include #include #include #include #include #include #include namespace myPrint{templat...

C++学习 STL之list之用法小结

/* list: 等同于双向链表,内存空间可以是不连续的,通过指针来进行数据的访问    优: 1)插入/删除效率高    缺: 1)不支持随机存取,查询效率较低 */ #include i...
  • skdkjxy
  • skdkjxy
  • 2015年02月13日 16:46
  • 377

C++ STL源码学习(list篇)

C++ list源代码学习整理。

C++stl学习文档 list

List: List是一个双向的链表,可高效地进行插入删除元素。 List不支持索引访问所以没有at(),[]等访问; List的接口 list成员 说明 ...

C++ STL学习 List iterator

环境: windows 7 x64, VC 6.0 STL List 中的 iterator存的是什么? 取元素使用 * 运算,比如 *iterSTList ,那么 iterSTList 是指针吗,...

STL学习笔记--4、序列式容器之list

list
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL中list学习
举报原因:
原因补充:

(最多只允许输入30个字)