c++学习之list容器

一、list容器基本概念

功能:将数据进行链式存储
链表:链表是由一个一个的节点组成的,他数据的存储地址不是连续的,每个节点中存储一个指向下一个节点地址的指针。
STL中的链表是一个双向循环链表
在这里插入图片描述
由于链表的存储方式并不是连续的内存空间,因此链表list的迭代器只支持前移和后移,属于双向迭代器,不能跳跃式访问。
list的优点
(1)采用动态存储分配,不会造成内存浪费
(2)插入删除方便
list缺点:
对内存空间的耗费较大

二、list容器的构造函数

函数原型

list< T>l ; //默认构造
list l<l1. beg(),l1.end()> ; //区间构造
list l(n,elem); //将n个元素拷贝给 l
list l (const list< T>&l1); //拷贝构造

代码示例

#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;

void print(const list<int>& l)
{
    for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
    {
        cout<< *it <<" ";
    }
    cout << endl;
}
void test2()
{
  //默认构造
  list<int>l;
  //尾插
  l.push_back(10);
  l.push_back(20);
  l.push_back(30);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  print(l);
  //区间构造
  list<int>l1(l.begin(),l.end());
  print(l1);
  //将 n个elem拷贝给l
  list<int>l2(10,100);
  print(l2);
  //拷贝构造
  list<int>l3(l2);
  print(l3);  
}
int main()
{ 
    test2();
    return 0;
}

结果输出
在这里插入图片描述

三、list容器的赋值与交换

函数原型

assign(beg,end); //区间赋值
assign(n,elem); //赋值n个elem
list& operator=(const list &list); //运算符重载赋值
swap(l); //交换

代码示例

#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;

void print(const list<int>& l)
{
    for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
    {
        cout<< *it <<" ";
    }
    cout << endl;
}
void test2()
{
  //默认构造
  list<int>l;
  //尾插
  l.push_back(10);
  l.push_back(20);
  l.push_back(30);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  print(l);
  
  //区间赋值
  list<int>l1;
  l1.assign(l.begin(), l.end());
  print(l1);

  //赋值n个elem
  list<int>l2;
  l2.assign(10,100);
  print(l2);

  //运算符重载
  list<int>l3;
  l3 = l2;
  print(l3);

  //交换
  list<int>l4;
  cout << "before swap" << endl;
  l4 = l3;
  print(l4);
  print(l1);

  cout << "after swap" << endl;
  l4.swap(l1);
  print(l4);
  print(l1);
  





}
int main()
{ 
    test2();
    return 0;
}

输出结果

在这里插入图片描述

四、容器大小操作

函数原型

size(); //容器个数
empty(); //是否为空
resize(num); //重新指定容器长度为num,变长,则添加默认值0,变短,则删除大于长度的元素
resize(num,elem);// //重新指定容器长度为num,变长,则添加默认值elem

代码示例

#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;

void print(const list<int>& l)
{
    for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
    {
        cout<< *it <<" ";
    }
    cout << endl;
}
void test2()
{
  //默认构造
  list<int>l;
  //尾插
  l.push_back(10);
  l.push_back(20);
  l.push_back(30);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  print(l);
  
  if(!l.empty())
  {
      cout<<" list is not empty" << endl;
      cout<<" list's size = " <<l.size() << endl;
  }

  l.resize(10);
  print(l);
  l.resize(20,1000); 
  print(l);
}
int main()
{ 
    test2();
    return 0;
}

输出结果
在这里插入图片描述

五、llist插入和删除

函数原型

push_back(); //尾插
pop_back(); //尾删
push_front(); //头插
pop_front(); //头删
insert(pos,elem);//指定位置pos,插入elem,返回elem位置
insert(pos,n,elem);//在指定位置pos处,插入n个elem;无返回值
insert(pos,beg,end);//区间插入,无返回值3
clear(); //清空
erase(beg,end); //区间删除,返回区间的下一个数据位置
erase(pos); //删除指定位置数据
remove(elem); //删除容器中所有elem

代码示例

#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;

void print(const list<int>& l)
{
    for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
    {
        cout<< *it <<" ";
    }
    cout << endl;
}
void test2()
{
  //默认构造
  list<int>l;
  //尾插
  l.push_back(10);
  l.push_back(20);
  l.push_back(30);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  cout << "tail insert" <<endl;
  print(l);
  l.clear();
  //头插
  l.push_front(10);
  l.push_front(20);
  l.push_front(30);
  l.push_front(40);
  l.push_front(50);
  l.push_front(60);
  cout <<" head insert" << endl; 
  print(l);
  //tail delete
  l.pop_back();
  cout <<" tail delete" << endl; 
  print(l);
  //head delete
  l.pop_front();
  cout <<" tail delete" << endl; 
  print(l);
  //insert in anywhere
  list<int>::iterator it1 = l.begin();
  list<int>::iterator it2 = l.end();
  l.insert(++it1,100);      
  l.insert(--it2,1000);
  print(l);
  //delete in anywhere
  l.erase(--it2);
  print(l);
  //delete elem while as the param of remove func
  l.remove(100); 
  print(l);
}
int main()
{ 
    test2();
    return 0;
}

输出结果
在这里插入图片描述

六、list的数据存取

函数原型

front() //返回第一个元素
back()//返回最后一个元素
list容器不支持随机访问,没有at和[]访问容器的能力,迭代器也不支持随机访问

代码示例

#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;

void print(const list<int>& l)
{
    for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
    {
        cout<< *it <<" ";
    }
    cout << endl;
}
void test2()
{
  //默认构造
  list<int>l;
  //尾插
  l.push_back(10);
  l.push_back(20);
  l.push_back(30);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  l.push_back(40);
  cout << "tail insert" <<endl;
  print(l);

  cout<<l.front() <<endl;  //the first elem in list
  cout<<l.back() <<endl;   //ths last elem in list

  list<int>::iterator it = l.begin();
  cout<<*(it) << endl;
  cout<<*(++it) << endl;
  cout<<*(++it) << endl;
  cout<<*(++it) << endl;

  
}
int main()
{ 
    test2();
    return 0;
}

输出结果
在这里插入图片描述

七、list容器的反转和排序

函数原型

reverse(); //反转链表
sort(); //链表排序

代码示例

#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <list>
using namespace std;

void print(const list<int>& l)
{
    for(list<int>::const_iterator it = l.begin(); it != l.end(); it++)
    {
        cout<< *it <<" ";
    }
    cout << endl;
}
bool myCompare(int va1, int va2)
{
    return va1 > va2;  //down sort:let va1>va2
}
void test2()
{
  //默认构造
  list<int>l;
  //尾插
  l.push_back(10);
  l.push_back(20);
  l.push_back(30);
  l.push_back(40);
  l.push_back(50);
  l.push_back(60);
  l.push_back(70);
  print(l);
  //reverse list
  l.reverse(); 
  print(l);
  //list sort
  l.sort();    //from small to  big 
  print(l);
  l.sort(myCompare);  //from big to  small 
  print(l); 
}
int main()
{ 
    test2();
    return 0;
}

结果输出
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值