概述
STL::list是STL最常用的容器之一,其本质上是一个双向环状链表,链表每一个结点内容如下:
template
struct __list_node {
typedef void* void_pointer;
void_pointer next; // 指向下一个节点的指针
void_pointer prev; // 指向前一个节点的指针
T data; //list 数据
};
由于其双链表的结构,因此list适合需要频繁插入和删除数据的场合,这个和vector刚好相反。
API
Member functions
(constructor) Construct list (public member function)
(destructor) List destructor (public member function)
operator= Copy container content (public member function)
Iterators:
begin Return iterator to beginning (public member function)
end Return iterator to end (public member function)
rbegin Return reverse iterator to reverse beginning (public member function)
rend Return reverse iterator to reverse end (public member function)
Capacity:
empty Test whether container is empty (public member function)
size Return size (public member function)
max_size Return maximum size (public member function)
resize Change size (public member function)
Element access:
front Access first element (public member function)
back Access last element (public member function)
Modifiers:
assign Assign new content to container (public member function)
push_front Insert element at beginning (public member function)
pop_front Delete first element (public member function)
push_back Add element at the end (public member function)
pop_back Delete last element (public member function)
insert Insert elements (public member function)
erase Erase elements (public member function)
swap Swap content (public member function)
clear Clear content (public member function)
Operations:
splice Move elements from list to list (public member function)
remove Remove elements with specific value (public member function)
remove_if Remove elements fulfilling condition (public member function template)
unique Remove duplicate values (member function)
merge Merge sorted lists (public member function)
sort Sort elements in container (public member function)
reverse Reverse the order of elements (public member function)
Allocator:
get_allocator Get allocator (public member function)
Member types
of template > class list;
member type definition
reference Allocator::reference
const_reference Allocator::const_reference
iterator Bidirectional iterator
const_iterator Constant bidirectional iterator
size_type Unsigned integral type (usually same as size_t)
difference_type Signed integral type (usually same as ptrdiff_t)
value_type T
allocator_type Allocator
pointer Allocator::pointer
const_pointer Allocator::const_pointer
reverse_iterator reverse_iterator
const_reverse_iterator reverse_iterator
相比于vector,list内存分配策略简单,每插入一个新元素,则new一个新结点,删除一个元素,则delete这个结点。需要注意的是,由于list的每一个结点除了包含对应的数据,还包含指向上一个和下一个元素的指针,因此,在资源紧张的环境下,这块占用的内存需要考虑。
splice
void splice ( iterator position, list& x );
void splice ( iterator position, list& x, iterator i );
void splice ( iterator position, list& x, iterator first, iterator last );
splice可以将一个list的元素搬到另一个list,避免了先删后插的做法,在数据元素比较大的情况下,还是相当高效的。
splice提供多个接口,可以搬移单个元素,部分元素or整个list .
示例:
#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int>list1(5,100);
list1.push_back(300);
list<int>::iterator it=list1.begin();
for(;it!=list1.end();it++)
cout<<*it<<" ";
cout<<endl;
list<int>list2;
it=list2.begin();
list2.splice(it,list1);
cout<<"list1 ";
for(list<int>::iterator it1=list1.begin();it1!=list1.end();it1++)
cout<<*it1<<" ";
cout<<endl;
cout<<"list2: ";
for(list<int>::iterator it2=list2.begin();it2!=list2.end();++it2)
cout<<*it2<<" ";
cout<<endl;
return 0;
}
输出结果
100 100 100 100 100 300
list1
list2: 100 100 100 100 100 300
Press any key to continue