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对象中的值具有唯一性。