C++链表类模板
链表(list),即双向链表容器,它不支持随机访问,访问链表元素要指针从链表的某个断点开始,插入和删除操作所花费的时间是固定的,和该元素在链表中的位置无关。list在任何位置插入和删除动作都很快,不像vector只能在末尾操作。
创建list链表类模板的方法:
#include<list> //调用list头文件
...
...
list<int>l; //定义一个list
//list表示声明一个链表,<type>表示链表的类型,l表示链表名。
list对象主要成员函数说明:
只是一些常用的,其它还有很多list函数。
函数 | 说明 |
---|---|
begin | 返回指向链表第一个元素的迭代器 |
end | 返回指向链表最后一个元素的迭代器 |
size | 返回链表的大小 |
clear | 删除链表中所有元素 |
erase(start,end) | 删除迭代器从start到end范围内的向量 |
erase(i) | 删除迭代器第i个元素 |
insert(i,x) | 把值x插入到由迭代器指明的第i个位置 |
insert(i,start,end) | 把迭代器从start到end范围的元素插入到指明的第i个位置 |
insert(i,n,x) | 把x的n个副本插入到由迭代器指明的第i个位置 |
push_back(x) | 将值x放到链表末尾 |
push_front(x) | 将值x放到链表首部 |
pop_back | 删除链表最后一个元素 |
pop_front | 删除链表第一个元素 |
resize(n,x) | 设置链表大小为n,初始值为x |
reverse | 颠倒元素的顺序 |
swap(vector) | 交换两个向量的内容 |
可以发现,list链表所支持的操作与vector向量很相近,但这些操作的实现原理不尽相同,执行效率也不一样。list双向链表的优点是插入元素的效率很高,缺点是不支持随机访问,也就是说,链表无法像数组一样通过索引来访问,形如:
list<int>l;
l[3]=4; //错误
cout<<l[3]; //错误
链表无法通过索引进行赋值和输入输出。
关于vector向量的学习————》》C++向量类模板
迭代器
对list双向链表各个元素的访问,通常使用迭代器。
迭代器定义方法:
list<int>::iterator it=l.begin();
定义了一个迭代器it指向双向链表 l 的开始指针。
list双向链表与迭代器的入门应用
源代码:
#include<iostream>
#include<list> //list头文件
using namespace std;
int main(){
list<int>l; //定义链表l
int a[8]={1,3,8,6,7,2,5,4}; //定义数组a
l=list<int>(a,a+8); //将数组a赋值给l
l.sort(); //排序
list<int>::iterator it1=l.begin(); //定义迭代器it1指向双向链表 l 的开始指针
for(;it1!=l.end();it1++)
cout<<*it1<<" "; //通过变更it1的指向遍历输出l中的所有元素
cout<<endl;
l.insert(l.end(),9); //将9插入到l的末尾
list<int>::iterator it2=l.begin();
for(;it2!=l.end();it2++)
cout<<*it2<<" ";
cout<<endl;
list<int>::iterator it3=l.begin();
cout<<*it3+3; //通过迭代器加减的方式取代索引输出
return 0;
}
值得一提的是,循环终止的条件是it!=l.end()而非人们惯用的it<l.end()。
结果图: