最基本的操作是增加、删除、修改、查询。
首先包头文件,还有命名空间否则无法使用
#include <list>
using namespace std;
1、增加
list<int> list_a;
//往尾巴添加
for(int i = 0; i < 10; i++)
{
list_a.push_back(i);
}
//往头部添加
for(int i = 0; i < 10; i++)
{
list_a.push_front(i);
}
//往中间添加
list<int>::iterator it = list_a.begin(); //迭代器
advance(it, 2); //移动到第二位
int data = 20;
list_a.insert(it, data);
//添加2个 相同的 data
list_a.insert(it, 2, data);
2、删除
pop_back 剔除尾巴 和 pop_front 剔除开头
注意加上限制条件 判定list是否为空,否则list会越界
如果要删除达到某个条件的结点,利用iterator迭代器操作。
我上网查过资料,应该是没有人有贴出正确且高效的代码,以下代码是我自己亲身试验研究过的
(欢迎大家分享自己的成果来讨论。)
void main()
{
list<int> v;
static int num = 0;
generate_n(back_inserter(v), 10, []()->int { return num++;});//生成存储值为0~9的容器
list<int>::iterator it = v.begin();
for (; it != v.end();)
{
if (*it < 11)//删除条件
{
//vector<int>::iterator tmp = [=]()mutable ->vector<int>::iterator {return it++;}();
list<int>::iterator tmp = it;
if (it == v.begin()) //如果删除结点是头结点
{
v.erase(it); //erase删除当前结点
it = v.begin(); //从头开始遍历
continue;
}
else //如果删除的是中间结点
{
tmp = prev(it, 1); //tmp设置成当前结点前一个
v.erase(it); //将当前结点删除
it = tmp; //erase后it会变成当前结点的下一个,会被tmp结点覆盖,称为没有意义的指针,需要手动将当前结点指向tmp。
}
}
it++; //将当前结点向后推一位
}
system("pause");
}
3.修改
list<int>::iterator it = v.begin();
for (; it != v.end();)
{
(*it) = 5; //利用迭代器指针修改值
}
4.查询
和修改大同小异,也是利用迭代器iterator。
5.排序
bool compare_int(int &a, int &b)
{
return a > b; // > 是降序 < 是升序
}
void fun(int x)
{
cout << x << endl;
}
void main()
{
list<int> a;
a.push_back(5);
a.push_back(2);
a.push_back(3);
a.sort(compare_int);
for_each(a.begin(), a.end(), fun);
}