STL中的list是一种双循环链表的存储结构,物理存储单元上非连续,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表由一系列结点组成,结点包括存储数据元素的数据域,以及存储前一个结点和后一个结点的地址的指针域。
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。简单说就是list的迭代器只能自增或自减,不能使用“+”与其他数相加。
优点:可以快速删除或插入某一个元素。
缺点:占用空间大,遍历麻烦。
就是STL常见的四种创建方式:
//四种创建方式
list L; //创建空list
L.push_back(1);
L.push_back(2);
L.push_back(3);
L.push_back(4);
L.push_back(5);
L.push_back(6);
listL1(L.begin(), L.end()); //拷贝另一个list的部分值
listL3(L1); //直接拷贝另一个list
listL4(10, 1000); //list L(n,elem); 创建一个含有n个相同元素elem的list
常见的STL 两种赋值:
1.assign()函数赋值
2.等号赋值。
list Lb; //等号赋值
Lb = La;
listLc; //两种assign()赋值
//Lc.assign(La.begin()+1, La.end() - 1);//错误代码
Lc.assign(La.begin(), La.end());
list Ld;
Ld.assign(9, 19); // L.assign(n,elem); n个相同元素elem赋值给list
list容器无法与其他容器一样直接选定索引位置插入或删除元素,因为list容器属于链式结构,其迭代器只能进行自增或者自减操作。(”+1“也不行,必须写成“++”)
//插入元素
L0.push_back(elem); //尾部插入元素elem
L0.push_front(elem); //头部插入元素elem
//指定位置插入元素
list::iterator it = L0.begin();
L0.insert(it,elem);
L0.insert(++L0.begin(),elem);
//删除元素
L0.pop_back(); //尾部删除元素
L0.pop_front(); //头部删除元素
//指定位置删除元素
list::iterator it1 = L0.begin();
L0.erase(++it1);
L0.erase(++L0.begin(), --L0.end());
L.front(); //返回首元素
L.back(); //返回末尾元素
list容器可以用迭代器遍历
list::iterator it = L0.begin();
for (list::iterator it = L0.begin(); it != L0.end(); it++)
{
cout << *it;
}
//6.1返回容器大小
L.size()
//6.2判断容器是否为空
L.empty() << endl;
//6.3重定义容器长度
L.resize(a, elem);//重定义list长度为a,若新list长度超过原有,则用elem填充,默认填充值为0
//6.4互换两容器的元素
L.swap(L0); //两链表交换元素
//6.5容器元素反转
L.reverse();
//6.6容器内元素排序
L.sort();
//6.7移除所有匹配的元素
L.remove(elem);
//6.8清空容器
L.clear();
#include
#include
using namespace std;
void test06(list L0);
//test03赋值
void test03(list L0)
{
cout << "test03赋值:" << endl;
list La;
La.push_back(10);
La.push_back(20);
La.push_back(10);
La.push_back(20);
La.push_back(10);
La.push_back(20);
list Lb; //等号赋值
Lb = La;
test06(Lb);
cout << endl;
listLc; //两种assign()赋值
//Lc.assign(La.begin()+1, La.end() - 1);//错误代码
Lc.assign(La.begin(), La.end());
test06(Lc);
cout << endl;
list Ld;
Ld.assign(9, 19); // L.assign(n,elem); n个相同元素elem赋值给list
test06(Ld);
cout << endl;
}
//test04插入,删除
void test04(list L0)
{
cout << "test04插入,删除:" << endl;
//4.1插入元素
L0.push_back(11); //尾部插入11
L0.push_front(22); //首元素插入22
//指定位置插入元素
list::iterator it = L0.begin();
L0.insert(it,33);
L0.insert(L0.begin(),44);
test06(L0);
cout << endl;
//4.2删除元素
L0.pop_back();
L0.pop_front();
//指定位置删除元素
list::iterator it1 = L0.begin();
L0.erase(++it1);
L0.erase(++L0.begin(), --L0.end());
//list容器无法与其他容器一样直接选定索引位置插入元素,
//因为其迭代器只能进行自增或者自减操作
cout << "04删除后为:";
test06(L0);
cout << endl;
}
//test05访问
void test05(list L0)
{
cout << "test05访问:" << endl;
//4.3访问元素
cout << "04首元素为:" << L0.front() << endl;
cout << "04尾元素为:" << L0.back() << endl;
//list容器不可以通过[]索引或at()函数的方式访问元素,可以用迭代器进行单个元素访问
}
//test06遍历
void test06(list L0)
{
//cout << "遍历:" << endl;
//list容器可以使用迭代器遍历
list::iterator it = L0.begin();
for (list::iterator it = L0.begin(); it != L0.end(); it++)
{
cout << *it;
}
cout << endl;
}
//test07方法函数
void test07(list L0)
{
cout << "test07方法函数:" << endl;
//6.1返回容器大小
//6.2判断容器是否为空
//6.3重定义容器长度
//6.4互换两容器的元素
//6.5容器元素反转
//6.6容器内元素排序
//6.7移除所有匹配的元素
//6.8清空容器
list L1;
L1.assign(6, 1);
L1.push_back(9);
L1.push_back(9);
list L2;
L2.assign(3, 2);
L2.push_back(3);
L2.push_back(4);
//6.1返回容器大小
cout <<"容器大小:"<< L1.size() << endl;
//6.2判断容器是否为空
cout << "判断容器是否为空:" << L1.empty() << endl;
//6.3重定义容器长度
L1.resize(9, 0);
cout << "重定义L1容器长度为9:";
test06(L1);
//6.4互换两容器的元素
L1.swap(L2); //两链表交换元素
cout << "交换后的L1结果为:";
test06(L1);
//6.5容器元素反转
L1.reverse();
cout << "L1反转后的结果为:";
test06(L1);
//6.6容器内元素排序
L1.sort();
cout << "L1排序后:";
test06(L1);
//6.7移除所有匹配的元素
L1.remove(2);
cout << "L1中移除2后:";
test06(L1);
//6.8清空容器
L1.clear();
cout << "清空L1后的结果为:";
test06(L1);
}
int main() {
//四种创建方式
list L; //创建空list
L.push_back(1);
L.push_back(2);
L.push_back(3);
L.push_back(4);
L.push_back(5);
L.push_back(6);
listL1(L.begin(), L.end()); //拷贝另一个list的部分值
listL3(L1); //直接拷贝另一个list
listL4(10, 1000); //list L(n,elem); 创建一个含有n个相同元素elem的list
test03(L);
test04(L);
test05(L);
cout << "test06遍历:" ;
test06(L);
cout << endl;
test07(L);
}