list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表。对于链表的迭代器只可以通过”++“或”--“的操作将迭代器移动到后继/前驱节点元素处,而不能进行+n或-n的操作。
1.创建list对象
list<int> l;//创建空链表
list<int> l(10);//创建具有10个元素的空链表
2.元素插入和遍历
插入有三种方式
①采用push_back()方法往尾部插入新元素,链表自动扩张
②采用push_front()方法往首部插入新元素,链表自动扩张
③采用insert()方法往迭代器位置插入新元素,链表自动扩张
#include<bits/stdc++.h>
using namespace std;
int main()
{
list<int> l;//创建空链表
l.push_back(10);//往链表最后面插入新元素
l.push_front(99);//往链表最前面插入新元素
list<int>::iterator it;
it = l.begin();
it++;//只能++ --不能+n -n
l.insert(it,66); //往链表it位置插入新元素
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << endl;
}
return 0;
}
也可以使用反向迭代器reverse_iterator反向遍历。
3.元素删除
①使用erase()删除,可以删除某个迭代器位置的元素,或者删除某个迭代器区间的元素
②使用pop_front删除链表首元素和pop_back()删除链表尾元素
③使用remove()删除链表中一个元素,值相同的元素都会被删除
④使用unique()剔除连续重复元素,只保留一个
#include<bits/stdc++.h>
using namespace std;
int main()
{
list<int> l;//创建空链表
for(int i = 0; i < 10; i++)
{
l.push_back(i);
if(i == 5)
{
l.push_back(i);
}
if(i == 6)
{
l.push_back(i);
l.push_back(i);
}
}
list<int>::iterator it,itt;
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}cout<<endl;
printf("删除第三个元素为:\n");
it = l.begin();it++;it++;
l.erase(it);
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}cout<<endl;
printf("删除第一个元素到第三个元素为:\n");
it = l.begin();
itt = l.begin();itt++;itt++;itt++;
l.erase(it,itt);
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}cout<<endl;
printf("删除第一个元素和最后一个元素为:\n");
l.pop_front();
l.pop_back();
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}cout<<endl;
printf("删除值为5的元素为:\n");
l.remove(5);
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}cout<<endl;
//剔除连续重复元素为
l.push_back(6);
l.push_back(6);
printf("在结束位置插入两个6为:\n");
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}cout<<endl;
l.unique();
printf("去重为:\n");
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}cout<<endl;
return 0;
}
4.元素查找
alogorithm中的find()函数,list没有自带的find函数
#include<bits/stdc++.h>
using namespace std;
int main()
{
list<int> l;//创建空链表
for(int i = 0; i < 10; i++)
{
l.push_back(i);
}
list<int>::iterator it;
for(it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}cout<<endl;
it = find(l.begin(),l.end(),2);
if(it != l.end())
cout << (*it) << endl;
else
printf("not found it\n");
it = find(l.begin(),l.end(),50);
if(it != l.end())
cout << (*it) << endl;
else
printf("not found it\n");
return 0;
}
5.排序
list排序需要依靠list自带的sort函数。自定义排序(回头补)。。。
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a, int b)//从大到小排序
{
return a > b;
}
int main()
{
list<int> l;//创建空链表
for(int i = 0; i < 10; i++)//插入0-9
{
l.push_back(i);
}
list<int>::iterator it;
l.sort(cmp);//排序
for(it = l.begin(); it != l.end(); it++)
{
cout<<(*it)<<" ";
}
return 0;
}