STL之list
来源:互联网 发布:屏幕放大镜软件 编辑:程序博客网 时间:2024/05/21 07:58
list是双向循环链表,双链表既可以向前又可以向后链接它的元素。在STL中,list和vector一样,是两个常被使用的容器。list不像vector那样,list的内存分配时是非连续的,因此,list不支持对元素的任意存取,只能通过迭代器来访问list中的元素。list将元素按顺序储存在链表中. 与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。list在头和尾都可以插入元素。list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front、pop_front,这是vector不具备的。和vector另一点不同的是,list的迭代器不会存在失效的情况,它不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器失效;list没有备份空间的概念,出入一个元素就申请一个元素的空间,所以它的迭代器不会失效。
list初始化时,申请的空间大小为6,存放下了data中的6个元素,当向lidata插入第7个元素“6”时,list申请新的节点单元,插入到list链表中,数据存放结构如图所示:int data[6]={3,5,7,9,2,4};list<int> lidata(data, data+6);lidata.push_back(6);
list每次增加一个元素,不存在重新申请内存的情况,它的成本是恒定的。而vector每当增加关键元素的时候,都需要重新申请新的更大的内存空间,会调用元素的自身的复制构造函数,存在构造成本。在销毁旧内存的时候,会调用析构函数,存在析构成本。所以在存储复杂类型和大量元素的情况下,list比vector更有优势!
使用时要包含list头文件( #include<list> ),要命名限定std::list。
一、构造、析构函数、= 运算符
1、功能:声明list容器。4种方式
list<int> first; //空的int类型的链表
list<int> second (4,100); // 4元素都为100的链表
list<int> third (second.begin(),second.end()); //遍历第二个链表
list<int> fourth (third); // 第三个链表的副本
2、功能:注销list。 ~list ();
3、原型:list1 = list2;
功能:将list2赋值给list1,包括list2的所有元素以及list2的size
返回值:指针
二、返回迭代器类的函数
begin、end 、rbegin、rend
举例:
begin指向第一个元素,黄色箭头。end是最后一个元素的后一个位置,黑色箭头。begin和end一般一起使用,按正序输出list。rbegin指逆序的第一个元素,即最后一个元素,蓝色箭头。rend指逆序的最后一个元素的前一个位置,即第一个元素的前一个位置,红色箭头。
Rbegin和rend一般一起使用,用于逆序输出list。
三、list的容量相关的函数
1、empty
原型:bool empty( ) const;
功能:判断lsit是否为空,即size是否为0
返回值:size为0,返回true,否则,返回false
2、size
原型:size_typesize() const;
功能:返回lsit中元素的个数
返回值:size_type
3、Max_size
原型:size_typemax_size () const;
功能:返回lsit的最大容量
返回值:
4、resize
原型:void resize( size_type sz, T c = T());
功能:重新分配lsit的大小。如果sz小于目前的size就将多余的值删除;如果sz大于目前的size,就在增加容量,且用c填充。例如:
mylist.resize(5); //将size定为5
mylist.resize(8,100); //将size定为8,多出的用100填充
mylist.resize(12); //将size定为12
四、获取元素
1、front
原型:referencefront ( );
功能:获取第一个元素
返回值:第一个元素的值
2、back
原型:referenceback ( );
const_reference back ( ) const
功能:获取最后一个元素
返回值:最后一个元素
五、修改lsit的函数
1、assign
原型:void assign( InputIterator first, InputIterator last );
void assign ( size_type n, constT& u)
功能:为list重新分配空间并赋值。将[first,last)范围内的值或者n次u值的拷贝赋给list
返回值:无
2、push_front:从头插入一个元素,pop_front:删除第一个元素。
push_back:在尾部插入一个元素,pop_back:删除最后一个元素。
3、insert
原型:iteratorinsert ( iterator position, const T& x );
void insert ( iterator position, size_type n, const T& x );
template <class InputIterator>
void insert ( iterator position, InputIterator first, InputIterator last);
功能:插入元素
insert ( iterator position, const T& x) :在position位置处插入元素x
insert ( iterator position, size_type n,const T& x ):在position位置处开始插入n个x
insert ( iterator position, InputIteratorfirst, InputIterator last ):在position位置处开始插入
[first,last)范围内的元素。
返回值:只有第一个函数返回插入的元素所在位置
4、erase
原型:iteratorerase ( iterator position );
iterator erase ( iterator first, iterator last );
功能:清除链表中position处或者[first,last)范围内的元素。会减少list的size值。
返回值:清除的最后一个元素的下一个位置(迭代器)
5、swap
原型:void swap (list<T,Allocator>& lst)
功能:将两个lsit交换
6、clear
功能:清空list
六、操作类的函数
1、splice
原型:设list2调用了splice函数
void splice ( iterator position,list<T,Allocator>& x );将list x中的所有元素插入到调用该函数的list2的position处。List x会被清空。
void splice ( iterator position,list<T,Allocator>& x, iterator i );将x中指向i的位置处的元素插入到list2的position处。X会将i位置处的值删除。
void splice ( iterator position,list<T,Allocator>& x, iterator first, iterator last ); 将x中[first,last)位置处的元素插入到list2的position处。
功能:Moveelements from list to list。将一个lsit中的值移动到另一个list
2、remove
原型:void remove( const T& value );
功能:清除链表中特定的值value,lsit的size会相应减少。
返回值:无
3、remove_if
原型:template<class Predicate>
void remove_if ( Predicate pred );
功能:在满足Predicatepred返回true值时,移除元素。pred可以是一个返回bool类型的函数,还可以是一个重写operator函数的类。 例如:
// a predicate implemented as a function:
bool single_digit (const int& value) {return (value<10); }
// a predicate implemented as a class:
class is_odd
{
public:
bool operator() (const int& value) {return (value%2)==1; }
};
返回值:无
4、unique
原型:void unique( );
template <class BinaryPredicate>
void unique ( BinaryPredicate binary_pred );按照规则binary_pred消除重复值。例如:
bool same_integral_part (double first,double second)
{ return ( int(first)==int(second) ); }
// a binary predicate implemented as aclass:
class is_near
{
public:
bool operator() (double first, double second)
{return (fabs(first-second)<5.0); }
};
调用:mylist.unique(same_integral_part);
mylist.unique (is_near());
功能:消除list中的重复元素
返回值:
5、merge
原型:void merge( list<T,Allocator>& x );
template <class Compare>
void merge ( list<T,Allocator>& x, Compare comp );
功能:合并两个已经有序(同时为升序或降序)的list。
merge()组合起两个排好序的表。如果一个表未排序,merge()仍然能产生出一个表,其中包含着原来两个表元素的并集。当然,对结果的排序就没有任何保证了。向splice()函数一样,merge()函数也不复制元素。
merge函数的作用是:将两个有序的序列合并为一个有序的序列。函数参数:merge(first1,last1,first2,last2,result,compare);//firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器,first2为第二个容器的首迭代器,last2为容器的末迭代器,result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)。
返回值:
6、sort
原型:void sort ();
template <class Compare>
void sort ( Compare comp );
功能:排序
返回值:
7、reverse
功能:将list中的元素逆置。
返回值:
总结:
assign() 给list赋值
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回list的配置器
insert() 插入一个元素到list中
max_size() 返回list能容纳的最大元素数量
merge() 合并两个list
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
rbegin() 返回指向第一个元素的逆向迭代器
remove() 从list删除元素
remove_if() 按指定条件删除元素
rend() 指向list末尾的逆向迭代器
resize() 改变list的大小
reverse() 把list的元素倒转
size() 返回list中的元素个数
sort() 给list排序
splice() 合并两个list
swap() 交换两个list
unique() 删除list中重复的元素
实例:
#include <iostream>#include <list> //头文件 <list>#include <numeric>#include <algorithm>using namespace std; typedef list<int> LISTINT; //创建一个list容器的实例LISTINTtypedef list<char> LISTCHAR; //创建一个list容器的实例LISTCHARint main(){ LISTINT listOne; //用LISTINT创建一个名为listOne的list对象 LISTINT::iterator i; //声明i为迭代器 listOne.push_front (2); //从前面向listOne容器中添加数据 listOne.push_front (1); listOne.push_back (3); //从后面向listOne容器中添加数据 listOne.push_back (4); cout<<"listOne.begin()--- listOne.end():"<<endl; for (i = listOne.begin(); i != listOne.end(); ++i) //从前向后显示listOne中的数据 cout << *i << " "; cout << endl; LISTINT::reverse_iterator ir; cout<<"listOne.rbegin()---listOne.rend():"<<endl; for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) //从后向前显示listOne中的数据 cout << *ir << " "; cout << endl; int Sum = accumulate(listOne.begin(), listOne.end(),0); //使用STL的accumulate(累加)算法 cout<<"Sum="<<Sum<<endl; LISTCHAR listTwo; //用LISTCHAR创建一个名为listOne的list对象 LISTCHAR::iterator j; //声明i为迭代器 listTwo.push_front ('A'); //从前面向listTwo容器中添加数据 listTwo.push_front ('B'); listTwo.push_back ('x'); //从后面向listTwo容器中添加数据 listTwo.push_back ('y'); cout<<"listTwo.begin()---listTwo.end():"<<endl; for (j = listTwo.begin(); j != listTwo.end(); ++j) //从前向后显示listTwo中的数据 cout << char(*j) << " "; cout << endl; j=max_element(listTwo.begin(),listTwo.end()); //使用STL的max_element算法求listTwo中的最大元素并显示 cout << "The maximum element in listTwo is: "<<char(*j)<<endl;return 0;}
- STL学习之list
- STL之list模板
- STL之list学习
- stl之list使用
- STL之List
- STL容器之list
- STL容器之list
- STL之count、list
- sgi stl 之list
- STL之list基础
- STL之list
- C++ STL之list
- stl库之list
- STL容器之list
- STL之list
- STL 之 list
- STL 之 list
- STL 之 list
- HttpClient4.x:Get和Post提交数据
- Mysql的JDBC 的常见连接属性
- 数据挖掘中的十个著名算法
- mangos源码分析--计划
- 最新水处理设备-矿泉水设备
- STL之list
- MFC线程同步——CEvent的使用
- FPGA图像处理项目(四)--二维FFT RapidIO
- Linux与grub下查看各分区设备名称
- 【ORACLE RAC】维护:开机 关机顺序,流程
- 你家我家
- java学习笔记 IO学习笔记1 文件
- Ubuntu里面设置静态IP地址
- apache的默认页如何修改