先回顾以下数据结构的内容:线性表包括:顺序表(vector)、链表(list),list是双向链表,注意头文件#include<list>
注:代码不含检验代码
[1] list与vector相似的用法
#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
list<int> a1;
int b1[]={1,2,3,4,5,6};
list<int> a2(b1,b1+6);//【注】对于list中的元素的访问只能用迭代子 不能直接用a2[3]
for(list<int>::iterator p=a2.begin();p!=a2.end();p++)
{
cout<<*p<<" ";
}
cout<<endl;
list<int> a3(a2);
list<int> a4=a2;//同vector
list<int> a5(10);//10个0
list<int> a6(10,90);//10个90
list<int> a7={2,3,4,5};//c++11
//a7.empty()用法同vector
//a7.size()用法同vector
//a7>a6 字典序比较
//a7.assign(a6.begin(),a6.end());
//a7.swap(a6); 同vector
//a7.front()第一个元素 a7.back()最后一个元素
//const 也一样:const的容器一定要用const的迭代子
return 0;
}
[2] list中元素的增加和删除
#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
int b[]={1,2,3,4,5,6};
list<int> a1(b,b+6);
a1.push_back(100);
a1.push_front(-1);//时间复杂度o(1)
a1.pop_back();//删除最后一个元素
a1.pop_front();//删除第一个元素
vector<int> a2={1,2,3,4,5,6};
a2.insert(a2.begin(),-1);//时间复杂度o(n)
//insert用法
list<int> a3={1,2,3,4,5,6};
list<int>::iterator p1=a3.begin();//不能直接加
p1++;
p1++;
a3.insert(p1,3,-2);//插入3个-2
//同样满足 a3.insert(p1,p开头,p结尾);
//同样满足 a3.insert(p1,{1,2,3});
//删除元素的操作【与vector不同】
list<int> a4={-1,90,-1,80,89,56,-1};
a4.remove(-1);
//a6.remove(函数对象)、a6.remove(函数)也成立
list<int> a5={1,2,3,4,5,6};
list<int>::iterator p5=a5.begin();//不能直接加
p1++;
p1++;
a5.erase(p1);//也成立
//a5.erase(p1,p2);也成立
return 0;
}
[3] list中的unique操作
#include<iostream>
#include<vector>
#include<list>
#include<string>
using namespace std;
bool IsEqual(string a, string b)
{
return a.size() == b.size();
}
int main()
{
//list::unique 将连续的等价只剩下一个
//1 8 8 8 8 9 9 9 8 ==》1 8 9 8
list<int> a1={1,2,3,4};
a1.unique();
//这个等价可以自己定义
string a="hello";
cout<<a.size()<<endl;
cout<<a.length()<<endl;
//比方说将字符串的长度相同定义为相等
list<string> a2={"hello","nihao","aaaaa","a","aa","bb","cc","jhdfksj"};
a2.unique(IsEqual);
return 0;
}
[3] list中的splice操作
#include<iostream>
#include<vector>
#include<list>
#include<string>
using namespace std;
int main()
{
//splice 绞合(被搬运的list自己变空)时间复杂度o(1)
list<int> a1={1,2,3,4,5,6};
list<int> a2={5,6,7,7,7};
list<int>::iterator p1=a1.begin();
p1++;
p1++;
a1.splice(p1,a2);
cout<<endl;
cout<<a2.size()<<endl;//此时a2变空
//部分搬运
list<int>::iterator p2=a2.begin();
p2++;
list<int>::iterator p3=a2.end();
p3--;
p3--;
a1.splice(p1,a2,p2,p3);//【注意】要写a2
a1.splice(p1,a2,p2);//将a2中的p2塞到p1里面
return 0;
}
[4] list中的merge操作:
单调递增:
#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
//merge 将两个[有序]链表重新合成一个有序链表,被搬的list变空
list<int> a1={1,3,5,5,6,7,8};
list<int> a2={2,3,4,5,5,5};
a1.merge(a2);
return 0;
}
单调递减型#include<iostream>
#include<vector>
#include<list>
#include<functional>//greater<int>()需要头文件
using namespace std;
int main()
{
//merge 将两个[有序]链表重新合成一个有序链表,被搬的list变空
//顺序为从大到小
list<int> a1={8,3,4,1};
list<int> a2={13,5,4,3,2};
a1.merge(a2,greater<int>());
for(list<int>::iterator p=a1.begin();p!=a1.end();p++)
{
cout<<*p<<" ";
}
cout<<endl;
return 0;
}
[5] 对于list的排序:
先回顾下对vector的排序:使用通用算法
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>//sort是个通用算法
using namespace std;
int main()
{
vector<int> v={6,3,5,2,5};
sort(v.begin(),v.end(),greater<int>());
for(vector<int>::iterator p=v.begin();p!=v.end();p++)
{
cout<<*p<<" ";
}
cout<<endl;
return 0;
}
对于list,使用成员函数
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
//sort
list<int> a1={8,3,4,1};
a1.sort();
a1.sort(greater<int>());
cout<<endl;
return 0;
}
也支持自定义排序(函数以及函数对象)
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
bool MyCmp(string a, string b)
{
return a.size()<b.size();
}
int main()
{
//自定义排序(函数)
list<string> a1={"hello","fhjdhs","a","ss88dd","sd"};
a1.sort(MyCmp);
return 0;
}
[6] 对于list的翻转:
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
//reverse翻转
list<int> a3={8,3,4,1};
a3.reverse();
return 0;
}
[7] list.resize()
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
//自定义排序
list<int> a1={1,2,3,4,5,6};
a1.resize(4);
//若a1.resize(10);//后面填充0
//若a1.resize(10,-2);//后面填充-1
return 0;
}
[8] list.emplace(), list.emplace_back(), list.emplace_front()
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
class MyTest
{
public:
MyTest(int a, int b)
{
x=a,y=b;
}
int x;
int y;
};
int main()
{
//1.emplace
//2.emplace_back
//3.emplace_front
MyTest b1(1,5);
MyTest b2(2,5);
MyTest b3(3,5);
MyTest b4(4,5);
MyTest b5(5,5);
MyTest b6(6,5);
list<MyTest> a1;
a1.push_back(b1);
a1.push_back(b2);
a1.push_back(b3);
a1.push_back(b4);
a1.push_back(b5);
a1.push_back(b6);
a1.emplace_front(0,0);
a1.emplace_back(100,100);
list<MyTest>::iterator p1=a1.begin();
p1++;
p1++;
a1.emplace(p1,990,990);//在第三个位置插入新的
return 0;
}
[9]list的迭代子不会失效
#include<iostream>
#include<vector>
#include<list>
#include<functional>
#include<algorithm>
using namespace std;
int main()
{
//迭代子不会失效
list<int> a1={1,2,3,4,5,6};
list<int>::iterator p1=a1.begin();
p1++;
p1++;
list<int>::iterator p2=a1.end();
p2--;
p2--;
a1.erase(p1);
cout<<*p2<<endl;//依旧指向5
return 0;
}