当前位置: 首页 > news >正文

c++的学习之路:14、list(1)

本章讲一下如何使用list,代码在文章末

目录

一、list介绍

二、增

三、删

四、查和改

五、交换

六、代码


一、list介绍

首先还是看一看官方文档的介绍如下图,如下方五点:

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。

3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。

4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。

5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)

在图二就是一些参数,可以明显看到没有【】,因为list就是相当于一个带头双向链表,参数和之前学习的差不多,就不详细讲了。

二、增

如下方代码就是就创建了一个链表为l1和l2进行尾插和头插然后在利用for进行打印。

void Test1()
{
    list<int> l1;
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(3);
    l1.push_back(4);
    list<int> l2;
    l2.push_front(1);
    l2.push_front(2);
    l2.push_front(3);
    l2.push_front(4);
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
    for (auto li : l2)
    {
        cout << li << ' ';
    }
    cout << endl;
}

三、删

如下就是先尾删打印在进行头删打印,代码和测试如下。

void Test2()
{
    list<int> l1;
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(3);
    l1.push_back(4);
    l1.push_back(5);
    l1.push_back(6);
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
    l1.pop_back();
    l1.pop_back();
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
    l1.pop_front();
    l1.pop_front();
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
}
 

四、查和改

下方代码就是利用find函数进行插在,找到了3然后返回位置给pos在这个地方进行插入30,然后在查找30再把这个删掉。

void Test3()
{
    list<int> l1;
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(3);
    l1.push_back(4);
    l1.push_back(5);
    l1.push_back(6);
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
    auto pos = find(l1.begin(),l1.end(),3);
    l1.insert(pos, 30);
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
    pos= find(l1.begin(), l1.end(), 30);
    l1.erase(pos);
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
}
 

五、交换

交换两个链表的数值,这个原理就是交换头指针,如下方代码所示。

void Test4()
{
    list<int> l1;
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(3);
    l1.push_back(4);
    l1.push_back(5);
    l1.push_back(6);
    list<int> l2;
    l2.push_back(10);
    l2.push_back(20);
    l2.push_back(30);
    l2.push_back(40);
    l2.push_back(50);
    l2.push_back(60);
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
    for (auto li : l2)
    {
        cout << li << ' ';
    }
    cout << endl;
    l1.swap(l2);
    for (auto li : l1)
    {
        cout << li << ' ';
    }
    cout << endl;
    for (auto li : l2)
    {
        cout << li << ' ';
    }
    cout << endl;

六、代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <list>
using namespace std;void Test1()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);list<int> l2;l2.push_front(1);l2.push_front(2);l2.push_front(3);l2.push_front(4);for (auto li : l1){cout << li << ' ';}cout << endl;for (auto li : l2){cout << li << ' ';}cout << endl;
}void Test2()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);l1.push_back(5);l1.push_back(6);for (auto li : l1){cout << li << ' ';}cout << endl;l1.pop_back();l1.pop_back();for (auto li : l1){cout << li << ' ';}cout << endl;l1.pop_front();l1.pop_front();for (auto li : l1){cout << li << ' ';}cout << endl;
}void Test3()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);l1.push_back(5);l1.push_back(6);for (auto li : l1){cout << li << ' ';}cout << endl;auto pos = find(l1.begin(),l1.end(),3);l1.insert(pos, 30);for (auto li : l1){cout << li << ' ';}cout << endl;pos= find(l1.begin(), l1.end(), 30);l1.erase(pos);for (auto li : l1){cout << li << ' ';}cout << endl;
}void Test4()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);l1.push_back(5);l1.push_back(6);list<int> l2;l2.push_back(10);l2.push_back(20);l2.push_back(30);l2.push_back(40);l2.push_back(50);l2.push_back(60);for (auto li : l1){cout << li << ' ';}cout << endl;for (auto li : l2){cout << li << ' ';}cout << endl;l1.swap(l2);for (auto li : l1){cout << li << ' ';}cout << endl;for (auto li : l2){cout << li << ' ';}cout << endl;
}int main()
{Test4();
}

http://www.lryc.cn/news/334168.html

相关文章:

  • huawei 华为交换机 配置 VLAN 聚合示例
  • 【QT+QGIS跨平台编译】056:【pdal-dimbuilder+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 【Python】探索Python中的aiohttp:构建高效并发爬虫
  • 创建真实项目vue2项目
  • 【大数据】安装hive-3.1.2
  • STM32工程 如何设置堆栈大小(Heap和Stack)
  • 光纤资源运维管理升级方案,让您的网络资产价值倍增!
  • 【深度学习】最强算法之:深度Q网络(DQN)
  • 微软文本转语音和语音转文本功能更新,效果显著!
  • 充场拉新工作室保证金靠谱吗?找一手渠道是否免费?
  • 揭秘淘宝商品详情数据接口(Taobao.item_get)
  • Linux从入门到精通 --- 4(上).快捷键、软件安装、systemctl、软链接、日期和时区、IP地址
  • ESP32调试笔记
  • python -- NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+
  • 解决nginx代理后,前端拿不到后端自定义的header
  • C++从入门到精通——类的6个默认成员函数之构造函数
  • 第十四届蓝桥杯省赛大学B组(C/C++)整数删除
  • openGauss学习笔记-257 openGauss性能调优-使用Plan Hint进行调优-Custom Plan和Generic Plan选择的Hint
  • 智慧校园|智慧校园管理小程序|基于微信小程序的智慧校园管理系统设计与实现(源码+数据库+文档)
  • 【信贷后台管理之(五)】
  • C++ 动态字符串String的介绍及经典用法展示
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • 【国产AI持续突破带动互联网智能生态进入正循环】
  • 全志 Linux Qt
  • 微功耗数据监测终端可应用在哪些场景?
  • Windows下Docker安装Kafka3+集群
  • 关于前端资源文件打包问题
  • 蓝桥杯备考随手记: 常用的字符串排序方式
  • Linux--进程(2)
  • 贪心算法思想