一、list容器基本概念
功能:将数据进行链式存储
链表:链表是由一个一个的节点组成的,他数据的存储地址不是连续的,每个节点中存储一个指向下一个节点地址的指针。
STL中的链表是一个双向循环链表
由于链表的存储方式并不是连续的内存空间,因此链表list的迭代器只支持前移和后移,属于双向迭代器,不能跳跃式访问。
list的优点
(1)采用动态存储分配,不会造成内存浪费
(2)插入删除方便
list缺点:
对内存空间的耗费较大
二、list容器的构造函数
函数原型
list< T>l ; //默认构造
list l<l1. beg(),l1.end()> ; //区间构造
list l(n,elem); //将n个元素拷贝给 l
list l (const list< T>&l1); //拷贝构造
代码示例
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;
void print(const list<int>& l)
{
for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout<< *it <<" ";
}
cout << endl;
}
void test2()
{
//默认构造
list<int>l;
//尾插
l.push_back(10);
l.push_back(20);
l.push_back(30);
l.push_back(40);
l.push_back(40);
l.push_back(40);
l.push_back(40);
print(l);
//区间构造
list<int>l1(l.begin(),l.end());
print(l1);
//将 n个elem拷贝给l
list<int>l2(10,100);
print(l2);
//拷贝构造
list<int>l3(l2);
print(l3);
}
int main()
{
test2();
return 0;
}
结果输出
三、list容器的赋值与交换
函数原型
assign(beg,end); //区间赋值
assign(n,elem); //赋值n个elem
list& operator=(const list &list); //运算符重载赋值
swap(l); //交换
代码示例
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;
void print(const list<int>& l)
{
for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout<< *it <<" ";
}
cout << endl;
}
void test2()
{
//默认构造
list<int>l;
//尾插
l.push_back(10);
l.push_back(20);
l.push_back(30);
l.push_back(40);
l.push_back(40);
l.push_back(40);
l.push_back(40);
print(l);
//区间赋值
list<int>l1;
l1.assign(l.begin(), l.end());
print(l1);
//赋值n个elem
list<int>l2;
l2.assign(10,100);
print(l2);
//运算符重载
list<int>l3;
l3 = l2;
print(l3);
//交换
list<int>l4;
cout << "before swap" << endl;
l4 = l3;
print(l4);
print(l1);
cout << "after swap" << endl;
l4.swap(l1);
print(l4);
print(l1);
}
int main()
{
test2();
return 0;
}
输出结果
四、容器大小操作
函数原型
size(); //容器个数
empty(); //是否为空
resize(num); //重新指定容器长度为num,变长,则添加默认值0,变短,则删除大于长度的元素
resize(num,elem);// //重新指定容器长度为num,变长,则添加默认值elem
代码示例
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;
void print(const list<int>& l)
{
for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout<< *it <<" ";
}
cout << endl;
}
void test2()
{
//默认构造
list<int>l;
//尾插
l.push_back(10);
l.push_back(20);
l.push_back(30);
l.push_back(40);
l.push_back(40);
l.push_back(40);
l.push_back(40);
print(l);
if(!l.empty())
{
cout<<" list is not empty" << endl;
cout<<" list's size = " <<l.size() << endl;
}
l.resize(10);
print(l);
l.resize(20,1000);
print(l);
}
int main()
{
test2();
return 0;
}
输出结果
五、llist插入和删除
函数原型
push_back(); //尾插
pop_back(); //尾删
push_front(); //头插
pop_front(); //头删
insert(pos,elem);//指定位置pos,插入elem,返回elem位置
insert(pos,n,elem);//在指定位置pos处,插入n个elem;无返回值
insert(pos,beg,end);//区间插入,无返回值3
clear(); //清空
erase(beg,end); //区间删除,返回区间的下一个数据位置
erase(pos); //删除指定位置数据
remove(elem); //删除容器中所有elem
代码示例
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;
void print(const list<int>& l)
{
for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout<< *it <<" ";
}
cout << endl;
}
void test2()
{
//默认构造
list<int>l;
//尾插
l.push_back(10);
l.push_back(20);
l.push_back(30);
l.push_back(40);
l.push_back(40);
l.push_back(40);
l.push_back(40);
cout << "tail insert" <<endl;
print(l);
l.clear();
//头插
l.push_front(10);
l.push_front(20);
l.push_front(30);
l.push_front(40);
l.push_front(50);
l.push_front(60);
cout <<" head insert" << endl;
print(l);
//tail delete
l.pop_back();
cout <<" tail delete" << endl;
print(l);
//head delete
l.pop_front();
cout <<" tail delete" << endl;
print(l);
//insert in anywhere
list<int>::iterator it1 = l.begin();
list<int>::iterator it2 = l.end();
l.insert(++it1,100);
l.insert(--it2,1000);
print(l);
//delete in anywhere
l.erase(--it2);
print(l);
//delete elem while as the param of remove func
l.remove(100);
print(l);
}
int main()
{
test2();
return 0;
}
输出结果
六、list的数据存取
函数原型
front() //返回第一个元素
back()//返回最后一个元素
list容器不支持随机访问,没有at和[]访问容器的能力,迭代器也不支持随机访问
代码示例
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;
void print(const list<int>& l)
{
for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout<< *it <<" ";
}
cout << endl;
}
void test2()
{
//默认构造
list<int>l;
//尾插
l.push_back(10);
l.push_back(20);
l.push_back(30);
l.push_back(40);
l.push_back(40);
l.push_back(40);
l.push_back(40);
cout << "tail insert" <<endl;
print(l);
cout<<l.front() <<endl; //the first elem in list
cout<<l.back() <<endl; //ths last elem in list
list<int>::iterator it = l.begin();
cout<<*(it) << endl;
cout<<*(++it) << endl;
cout<<*(++it) << endl;
cout<<*(++it) << endl;
}
int main()
{
test2();
return 0;
}
输出结果
七、list容器的反转和排序
函数原型
reverse(); //反转链表
sort(); //链表排序
代码示例
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;
void print(const list<int>& l)
{
for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout<< *it <<" ";
}
cout << endl;
}
bool myCompare(int va1, int va2)
{
return va1 > va2; //down sort:let va1>va2
}
void test2()
{
//默认构造
list<int>l;
//尾插
l.push_back(10);
l.push_back(20);
l.push_back(30);
l.push_back(40);
l.push_back(50);
l.push_back(60);
l.push_back(70);
print(l);
//reverse list
l.reverse();
print(l);
//list sort
l.sort(); //from small to big
print(l);
l.sort(myCompare); //from big to small
print(l);
}
int main()
{
test2();
return 0;
}
结果输出