List:
List是一个双向的链表,可高效地进行插入删除元素。
List不支持索引访问所以没有at(),[]等访问;
List的接口
list成员 | 说明 |
constructor | 构造函数 |
destructor | 析构函数 |
operator= | 赋值重载运算符 |
assign | 分配值 |
front | 返回第一个元素的引用 |
back | 返回最后一元素的引用 |
begin | 返回第一个元素的指针(iterator) |
end | 返回最后一个元素的下一位置的指针 |
rbegin | 返回链表最后一元素的后向指针(reverse_iterator or const) |
rend | 返回链表第一元素的下一位置的后向指针 |
push_back | 增加一元素到链表尾 |
push_front | 增加一元素到链表头 |
pop_back | pop_back()删除链表尾的一个元素 |
pop_front | 删除链表头的一元素 |
clear | 删除所有元素 |
erase | 删除一个元素或一个区域的元素(两个重载) |
remove | 删除链表中匹配值的元素(匹配元素全部删除) |
remove_if | 删除条件满足的元素(遍历一次链表),参数为自定义的回调函数 |
empty | 判断是否链表为空 |
max_size | 返回链表最大可能长度 |
size | 返回链表中元素个数 |
resize | 重新定义链表长度(两重载函数) |
reverse | 反转链表 |
sort | 对链表排序,默认升序 |
merge | 合并两个有序链表并使之有序 |
splice | 对两个链表进行结合(三个重载函数) 结合后第二个链表清空 |
insert | 在指定位置插入一个或多个元素(三个重载函数) |
swap | 交换两个链表(两个重载) |
unique | 删除相邻重复元素 |
1.list数据输入
1)Push_back();
代码
for (int i=0;i<20;i++)
{
l0.push_back(i);//赋值0到19;
}
2)assign();
l0.assign(20,8);//赋值20个8;
这个方法还有个重载的,这里不说了;
2.list数据的获取
因为list是双向链表,不能直接用索引,下表访问,所以我们这里用它的迭代指针进行访问
for (list<int>::iterator it=l0.begin();it!=l0.end();it++)
{
cout<<*it<<endl;
}
3.list数据删除
Erase();
注意erase里面的参数是迭代指针;
代码
for (list<int>::iterator it=l0.begin();it!=l0.end();)
{
if ((*it)%2==0)//这里删除了所有的偶数项
{
it=l0.erase(it);
}
else
{
it++;
}
}
总的代码:
#include "stdafx.h"
#include<iostream>
#include <list>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"list test"<<endl;
list<int>l0;
for (int i=0;i<20;i++)
{
l0.push_back(i);
}
for (list<int>::iterator it=l0.begin();it!=l0.end();)
{
if ((*it)%2==0)
{
it=l0.erase(it);
}
else
{
it++;
}
}
for (list<int>::iterator it=l0.begin();it!=l0.end();it++)
{
cout<<*it<<endl;
}
system("pause");
return 0;
}
4. remove()删除链表中匹配值的元素(匹配元素全部删除)
L0.remove(10);//删除链表中所有的参数为10的项
5.remove_if()删除条件满足的元素(遍历一次链表),参数为自定义的回调函数
bool test(const int & a){return a<10;}//删除小于10的
l0.remove_if(test);
6.merge()合并两个有序链表并使之有序
代码
#include "stdafx.h"
#include<iostream>
#include <list>
using namespace std;
bool test(const int & a){return a<10;}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"list test"<<endl;
list<int>l0;
for (int i=0;i<10;i++)
{
l0.push_back(i);
}
list<int>l1;
for (int i=20;i<25;i++)
{
l1.push_back(i);
}
l0.merge(l1);//合并l1到l0
for (list<int>::iterator it=l0.begin();it!=l0.end();it++)
{
cout<<*it<<endl;
}
system("pause");
return 0;
}
运行结果
7.splice()对两个链表进行结合(三个重载函数) 结合后第二个链表清空
#include "stdafx.h"
#include<iostream>
#include <list>
using namespace std;
bool test(const int & a){return a<10;}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"list test"<<endl;
list<int>l0;
for (int i=0;i<10;i++)
{
l0.push_back(i);
}
list<int>l1;
for (int i=20;i<25;i++)
{
l1.push_back(i);
}
l0.splice(++l0.begin(),l1,++l1.begin(),l1.end());//合并l1第二个位置到最后,到l0的第二个位置
for (list<int>::iterator it=l0.begin();it!=l0.end();it++)
{
cout<<*it<<endl;
}
system("pause");
return 0;
}
运行结果:
8.insert()在指定位置插入一个或多个元素(三个重载函数)
代码
#include "stdafx.h"
#include<iostream>
#include <list>
using namespace std;
bool test(const int & a){return a<10;}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"list test"<<endl;
list<int>l0;
for (int i=0;i<10;i++)
{
l0.push_back(i);
}
l0.insert(++l0.begin(),100);//在第二个位置插入100
l0.insert(++l0.begin(),2,100);//在第二个位置插入2个100
for (list<int>::iterator it=l0.begin();it!=l0.end();it++)
{
cout<<*it<<endl;
}
system("pause");
return 0;
}
运行结果:
一共三个100;
参考点击打开链接