list容器

本文详细介绍了STL中的list容器,包括链表与数组的区别、构造函数原型、赋值和交换操作、容器大小的查询、插入和删除元素的方法、数据存取特性以及如何进行反转和排序。list作为双向循环链表,支持在任意位置的插入和删除,但不支持随机访问。其迭代器只能前后移动。此外,还提到了list在空间利用上的优势,以及如何实现自定义排序规则。
摘要由CSDN通过智能技术生成

目录

链表与数组的区别

构造函数原型

赋值和交换函数

容器大小

插入和删除

数据存取

反转和排序


链表与数组的区别

 链表有数据域和指针域,指针域指向链表中下一结点,所以形成顺序的表,链表可以在任意位置随意插入和删除。

 

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值