目录
链表与数组的区别
链表有数据域和指针域,指针域指向链表中下一结点,所以形成顺序的表,链表可以在任意位置随意插入和删除。
STL中的链表是双向循环链表,每个结点有一个指针指向前面结点的地址,一个指针指向后面结点地址且首尾相连。
因为链表存储方式不是连续空间,所以链表list的迭代器只支持前移和后移,属于双向迭代器;即只能连续++和--,不能直接+n和-n;
list不会造成空间浪费,因为不像vector开辟的是连续的空间。
构造函数原型
与vector、deque差不多
list<int>l1; //默认构造
list<int>l2(l1.begin(),l1.end()); //区间构造
list<int>l3(10,100); //n个elem
list<int>l4(l1); //拷贝构造
赋值和交换函数
//赋值操作
list<int>l1;
l1.assign(2,5); //给l1两个5
list<int>l2;
l2.assign(l1.begin(),l1.end()); //区间赋值,将l1的值赋给l2
list<int>l3;
l3=l1; //使用=号将l1值赋给l3
//交换
list<int>l4;
l4.swap(l1); //将l1和l4的值交换。
容器大小
默认值为0;
插入和删除
pos必须是迭代器 例:
list<int>::iterator it = L.begin( );
L . insert(++it,19);
数据存取
list是链表,不是连续空间,不能用下标来访问元素
可以使用迭代器读取
for(list<int>::const_iterator it=l.begin();it!=l.end();it++)
{
cout<<*it<<endl;
}
可以使用const修饰,防止被修改。
反转和排序
L.reverse() ;
L.sort () ; //不支持随机访问的容器,内部会提供一些算法,所以sort是内部函数,需要用对象调用。 默认是升序。
降序排列
bool mycompare(int v1,int v2)
{
return v1>v2;
}
int main()
{
list<int>L;
L.sort(mycompare);
}
自定义排序改则
class person
{
public:
person(string a,int b,int c)
{
name=a;
age=b;
height=c;
}
string name;
int age;;
int height;
};
bool mycompare(person &p1,person &p2)
{
if(p1.age==p2.age)
return p1.height>p2.height; //年龄相同按身高降序
return p1.age<p2.age; //年龄升序
}
int main()
{
person p1("张飞",18,180);
person p2("张鱼",20,180);
person p3("张可",18,170);
list<person>L;
L.push_back(p1);
L.push_back(p2);
L.push_back(p3);
L.sort(mycompare);
for(list<person>::iterator it=L.begin();it!=L.end();it++)
cout<<it->name<<" "<<it->age<<" "<<it->height<<endl;
}