【C++】———list容器

news2025/1/20 1:47:32

前言

1.list容器简单来说其实就是之前的链表结构。

2.这里的list用的是双向带头结点的循环链表。

目录

前言

一  构造函数

1.1   list ();

1.2    list (size_type n, const value_type& val = value_type() );

1.3   list (InputIterator first, InputIterator last );

1.4   list (const list& x);

二  析构函数 

~list();

三  赋值运算符重载

list& operator= (const list& x);

 四  迭代器

 4.1  正向迭代器

4.2  反向迭代器

​ 五 容量函数

5.1  bool empty() const;

5.2  size_type size() const;

六  修改器

6.1  assign()

 6.2  插入数据和删除数据

5.insert ()

6.erase()

6.3  void resize (size_type n, value_type val = value_type());

6.4 void clear();

 七  操作

7.1  splice()

 7.2 unique()

总结


一  构造函数

1.1   list ();

括号里面是一个适配器。

 空容器构造函数(默认构造函数)

 构造一个没有元素的空容器。 

1.2    list (size_type n, const value_type& val = value_type() );

填充构造函数

构造一个包含n个元素的容器。每个元素都是val的一个副本。

1.3   list (InputIterator first, InputIterator last );

里面的InputIterator代表的是迭代器的类型。

范围构造函数

构造一个具有与范围[first,last)一样多元素的容器,其中每个元素都按照相同的顺序由该范围内的相应元素构造。

1.4   list (const list& x);

拷贝构造函数

按照相同顺序构造一个容器,其中包含x中每个元素的副本。

 测试案例:

#define _CRT_SECURE_NO_WARNINGS 1
// constructing lists
#include <iostream>
#include <list>
using namespace std;
int main()
{
   
    std::list<int> first;                                // 一个空列表
    std::list<int> second(4, 100);                       // 4个100的值
    std::list<int> third(second.begin(), second.end());  // 迭代器用second的值初始化third
    std::list<int> fourth(third);                       // third的一个拷贝

    // 这里也可以用数组去迭代初始化
    int myints[] = { 16,2,77,29 };
    std::list<int> fifth(myints, myints + sizeof(myints) / sizeof(int));

    cout << "first:";
    for (std::list<int>::iterator it = first.begin(); it != first.end(); it++)
        std::cout << *it << ' ';
    cout << endl;


    cout << "second:";
    for (std::list<int>::iterator it = second.begin(); it != second.end(); it++)
        std::cout << *it << ' ';
    cout << endl;


    cout << "third:";
    for (std::list<int>::iterator it = third.begin(); it != third.end(); it++)
        std::cout << *it << ' ';
    cout << endl;


    cout << "fourth:";
    for (std::list<int>::iterator it = fourth.begin(); it != fourth.end(); it++)
        std::cout << *it << ' ';
    cout << endl;

    std::cout << "fifth: ";
    for (std::list<int>::iterator it = fifth.begin(); it != fifth.end(); it++)
        std::cout << *it << ' ';
    std::cout << '\n';

    return 0;
}

二  析构函数 

~list();

把所有容器元素都销毁,并且把分配器的空间释放。

三  赋值运算符重载

list& operator= (const list& x);

测试用例:

#define _CRT_SECURE_NO_WARNINGS 1
// assignment operator with lists
#include <iostream>
#include <list>
using namespace std;
int main()
{
	list<int> first(3);      // 初始化为3
	list<int> second(5);     // 初始化为5

	second = first;//赋值
	first = list<int>();//把一个匿名对象赋值给first

	cout << "Size of first: " << int(first.size()) << endl;
	cout << "Size of second: " << int(second.size()) << endl;
	return 0;
}

​ 

 四  迭代器

迭代器分为正向迭代器和反向迭代器

 4.1  正向迭代器

iterator begin()   

iterator end()

测试用例

#define _CRT_SECURE_NO_WARNINGS 1
// list::begin
#include <iostream>
#include <list>
using namespace std;
int main()
{
    int myints[] = { 75,23,65,42,13 };
    list<int> mylist(myints, myints + 5);

    std::cout << "mylist contains:";
    for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)
        cout << ' ' << *it;

    cout <<endl;

    return 0;
}

4.2  反向迭代器

reverse_iterator rbegin();

reverse_iterator rend();

测试用例

#define _CRT_SECURE_NO_WARNINGS 1
// list::rbegin/rend
#include <iostream>
#include <list>
using namespace std;
int main()
{
    list<int> mylist;
    for (int i = 1; i <= 5; i++)
    {
        mylist.push_back(i);
    }

    cout << "mylist backwards:";
    for (list<int>::reverse_iterator rit = mylist.rbegin(); rit != mylist.rend(); ++rit)
        cout << ' ' << *rit;

    cout << endl;

    return 0;
}

​ 
五 容量函数

5.1  bool empty() const;
// list::empty
#include <iostream>
#include <list>

int main()
{
    std::list<int> mylist;
    int sum(0);

    for (int i = 1; i <= 10; ++i) mylist.push_back(i);

    while (!mylist.empty())
    {
        sum += mylist.front();
        mylist.pop_front();
    }

    std::cout << "total: " << sum << '\n';

    return 0;
}

为了方便测试,所以这里用了没有说明的函数。

5.2  size_type size() const;
// list::size
#include <iostream>
#include <list>

int main()
{
	std::list<int> myints;
	std::cout << "0. size: " << myints.size() << '\n';

	for (int i = 0; i < 10; i++) myints.push_back(i);
	std::cout << "1. size: " << myints.size() << '\n';

	myints.insert(myints.begin(), 10, 100);
	std::cout << "2. size: " << myints.size() << '\n';

	myints.pop_back();
	std::cout << "3. size: " << myints.size() << '\n';

	return 0;
}

 

六  修改器

6.1  assign()

替换内容,并相应的修改大小

void assign (InputIterator first, InputIterator last);

void assign (size_type n, const value_type& val);

/ list::assign
#include <iostream>
#include <list>

int main ()
{
  std::list<int> first;
  std::list<int> second;

  first.assign (7,100);                    //设置7个100的值

  second.assign (first.begin(),first.end());//用这7个值去替代second里面的内容

  int myints[]={1776,7,4};
  first.assign (myints,myints+3);            //用数组里面的内容去替代

  std::cout << "Size of first: " << int (first.size()) << '\n';
  std::cout << "Size of second: " << int (second.size()) << '\n';
  return 0;
}

 6.2  插入数据和删除数据

1.void push_front (const value_type& val);//头插

2.void pop_front();//头删

3.void push_back (const value_type& val);//尾插

4.void pop_back();//尾删

这些操作函数在上面的测试中都有演示


#include <iostream>
#include <list>

int main()
{
    std::list<int> mylist;
    int sum(0);
    mylist.push_back(100);//尾插
    mylist.push_back(200);
    mylist.push_back(300);
    mylist.push_front(400);//头插
    mylist.pop_front();
    while (!mylist.empty())
    {
        sum += mylist.back();
        mylist.pop_back();//尾删
    }

    std::cout << "The elements of mylist summed " << sum << '\n';

    return 0;
}

5.insert ()

 iterator insert (iterator position, const value_type& val);//插入一个数据

void insert (iterator position, size_type n, const value_type& val);//插入n个数据

// inserting into a list
#include <iostream>
#include <list>
#include <vector>

int main()
{
    std::list<int> mylist;
    std::list<int>::iterator it;

   
    for (int i = 1; i <= 5; ++i) mylist.push_back(i); // 1 2 3 4 5

    it = mylist.begin();
    ++it;       
    mylist.insert(it, 10);                        // 1 10 2 3 4 5

                        
    mylist.insert(it, 2, 20);                      // 1 10 20 20 2 3 4 5

    --it;       // it 指向第二个20            ^

    std::vector<int> myvector(2, 30);
    mylist.insert(it, myvector.begin(), myvector.end());
    // 1 10 20 30 30 20 2 3 4 5
    //               ^
    std::cout << "mylist contains:";
    for (it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';

    return 0;
}

 

6.erase()

iterator erase (iterator position);//删除一个数据

iterator erase (iterator first, iterator last);//删除迭代器区间的数据

// erasing from list
#include <iostream>
#include <list>

int main()
{
    std::list<int> mylist;
    std::list<int>::iterator it1, it2;

    // set some values:
    for (int i = 1; i < 10; ++i) mylist.push_back(i * 10);

                                // 10 20 30 40 50 60 70 80 90
    it1 = it2 = mylist.begin(); // ^^
    advance(it2, 6);            // ^                 ^
    ++it1;                      //    ^              ^

    it1 = mylist.erase(it1);   // 10 30 40 50 60 70 80 90
                               //    ^           ^

    it2 = mylist.erase(it2);   // 10 30 40 50 60 80 90
                               //    ^           ^

    ++it1;                      //       ^        ^
    --it2;                      //       ^     ^

    mylist.erase(it1, it2);     // 10 30 60 80 90
                                //        ^

    std::cout << "mylist contains:";
    for (it1 = mylist.begin(); it1 != mylist.end(); ++it1)
        std::cout << ' ' << *it1;
    std::cout << '\n';

    return 0;
}

这里的advance起到一个推动迭代器的功能,

这里删除元素的时候需要用一个变量来接收是为了防止迭代器失效的问题。

6.3  void resize (size_type n, value_type val = value_type());

1.如果n<当前容量大小,那么会把容量缩到n,并且删除多余的元素

2.如果n>当前容量,会把容量扩到n,多余的元素会以val值来填充

// resizing list
#include <iostream>
#include <list>

int main()
{
    std::list<int> mylist;

    // set some initial content:
    for (int i = 1; i < 10; ++i) mylist.push_back(i);

    mylist.resize(5);
    mylist.resize(8, 100);
    mylist.resize(12);

    std::cout << "mylist contains:";
    for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;

    std::cout << '\n';

    return 0;
}

 

6.4 void clear();
// clearing lists
#include <iostream>
#include <list>

int main()
{
    std::list<int> mylist;
    std::list<int>::iterator it;

    mylist.push_back(100);
    mylist.push_back(200);
    mylist.push_back(300);

    std::cout << "mylist contains:";
    for (it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';

    mylist.clear();//清除
    mylist.push_back(1101);
    mylist.push_back(2202);

    std::cout << "mylist contains:";
    for (it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';

    return 0;
}

 七  操作

7.1  splice()

移动后,原容器的元素会被删除掉

void splice (iterator pos, list& x);//将元素从x转移到容器中,并将它们插入到指定位置。

void splice (iterator pos, list& x, iterator i);//移动指定的元素

void splice (iterator pos, list& x, iterator first, iterator last);//移动迭代区间的元素到容器里面

// splicing lists
#include <iostream>
#include <list>

int main()
{
    std::list<int> mylist1, mylist2;
    std::list<int>::iterator it;

    
    for (int i = 1; i <= 4; ++i)
        mylist1.push_back(i);      // mylist1: 1 2 3 4

    for (int i = 1; i <= 3; ++i)
        mylist2.push_back(i * 10);   // mylist2: 10 20 30

    it = mylist1.begin();
    ++it;                         // points to 2

    mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4
    // mylist2 (empty)
    // it 依然指向2

    mylist2.splice(mylist2.begin(), mylist1, it);
    // mylist1: 1 10 20 30 3 4
    // mylist2: 2
    // it现在已经失效了
    it = mylist1.begin();//重新赋值
    std::advance(it, 3);           // it 指向30

    mylist1.splice(mylist1.begin(), mylist1, it, mylist1.end());
    // mylist1: 30 3 4 1 10 20

    std::cout << "mylist1 contains:";
    for (it = mylist1.begin(); it != mylist1.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';

    std::cout << "mylist2 contains:";
    for (it = mylist2.begin(); it != mylist2.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';

    return 0;
}

 7.2 unique()

相当于是一个去重的函数

void unique();

int main()
{
	std::list<int> mylist1;
	std::list<int>::iterator it;
	mylist1.push_back(1);
	mylist1.push_back(1);
	mylist1.push_back(2);
	mylist1.push_back(2);
	mylist1.push_back(4);
	mylist1.push_back(4);
	mylist1.push_back(5);
	for (it = mylist1.begin(); it != mylist1.end(); it++)
	{
		std::cout <<" " << *it;
	}
	std::cout << '\n';
	mylist1.unique();
	for (it = mylist1.begin(); it != mylist1.end(); it++)
	{
		std::cout << " " << *it;
	}
	return 0;
}

但是对于另外一种情况,可能不是很明显,比如如果队列不是有序的,那么去重的效果就会差一点 

所以这个并不能达到无忧无虑的状态,必要情况下需要自己排序

总结

以上就是list的全部内容了,可能还有一些函数没有说明,会放在list模拟实现里面说明,list和之前的vector的操作都是大差不差的,主要的区别在于底层的实现  🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1790176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

和平饭店短视频:成都科成博通文化传媒公司

和平饭店短视频&#xff1a;历史的沉淀与现代的演绎 随着短视频平台的兴起&#xff0c;越来越多的人开始通过镜头记录生活、分享故事。在众多短视频中&#xff0c;以“和平饭店”为主题的短视频独树一帜&#xff0c;以其独特的魅力吸引了大量观众的目光。成都科成博通文化传媒…

【AndroidStudio旧版本BUG问题】完美解决运行报错问题Invalid keystore format

由于之前安装的版本导致AndroidStudio 运行报错&#xff1a;Invalid keystore format 在如下截图的路径中删了debug.keystore重新打开Android Studio运行一下就好了&#xff01;&#xff01;&#xff01; 下面介绍各个模块功能&#xff1a; adbkey 是 Android Debug Bridge (AD…

Deap因子挖掘:比gplearn强100倍(代码+数据)

原创文章第550篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 续前面两篇&#xff0c;继续使用Deap做因子挖掘——与咱们的Quantlab因子表达式引擎直接关联起来了&#xff1a; 1、生成的因子&#xff0c;在训练集和测试集上计算ic值。 def ma…

SQL进阶day9————聚合与分组

目录 1聚合函数 1.1SQL类别高难度试卷得分的截断平均值 1.2统计作答次数 1.3 得分不小于平均分的最低分 2 分组查询 2.1平均活跃天数和月活人数 2.2 月总刷题数和日均刷题数 2.3未完成试卷数大于1的有效用户 1聚合函数 1.1SQL类别高难度试卷得分的截断平均值 我的错误…

云动态摘要 2024-06-05

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [1元/年起]618大促-对象存储分会场 腾讯云 2024-06-03 对象存储限时破价秒杀&#xff0c;标准存储新老同享历史低价&#xff0c;新客首单低至1元&#xff0c;爆款资源包低于2折购 云服务器…

安全测试用例及解析(Word原件,直接套用检测)

5 信息安全性测试用例 5.1 安全功能测试 5.1.1 标识和鉴别 5.1.2 访问控制 5.1.3 安全审计 5.1.4 数据完整性 5.1.5 数据保密性 5.1.6 软件容错 5.1.7 会话管理 5.1.8 安全漏洞 5.1.9 外部接口 5.1.10 抗抵赖 5.1.11 资源控制 5.2 应用安全漏洞扫描 5.2.1 应用安全漏洞扫描 5.3…

王道408数据结构CH2_线性表

概述 2 线性表 2.1 基本操作 2.2 顺序表示 线性表的元素从1开始&#xff0c;数组元素下标从0开始 2.2.1 结构体定义 #define Maxsize 50typedef struct{ElemType data[Maxsize];int length; }SqList;#define Initsize 100typedef struct{ElemType *data;int Maxsize ,length;…

基于EasyX的贪吃蛇小游戏 - C语言

游戏基本功能演示&#xff1a; 1.主菜单界面 2.自定难度界面 在这里可以自行设定游戏的难度&#xff0c;包括蛇的移动速度&#xff0c;初始节数&#xff0c;以及默认模式&#xff0c;参考线&#xff08;网格&#xff09;。这些设定的数据都会在右上角的游戏属性栏中实时显示。…

十、结果处理器

这一章和上一章参数处理器类似 首先是在XML解析的时候&#xff0c;顺便解析resultMap和resultType&#xff0c;一般更多的可能用的是resultType&#xff0c;为了实现统一&#xff0c;使用 resultType 的情况下&#xff0c;Mybatis也会创建一个resultMap实体类映射。 使用的时…

云服务器安装宝塔Linux面板全流程,新手教程!

云服务器如何宝塔Linux面板&#xff1f;阿小云以阿里云服务器为例安装宝塔Linux面板全流程&#xff0c;非常简单&#xff1a; 使用阿里云服务器安装宝塔面板教程&#xff0c;阿里云服务器网以CentOS操作系统为例&#xff0c;安装宝塔Linux面板&#xff0c;先远程连接到云服务器…

化栈为队00

题目链接 化栈为队 题目描述 注意点 只能使用标准的栈操作假设所有操作都是有效的 解答思路 使用两个栈模拟队列&#xff0c;第一个栈stk1是按正常栈顺序存储元素&#xff0c;第一个栈stk2是按队列顺序存储元素&#xff0c;初始入栈都是将元素添加到stk1中&#xff0c;当需…

【漯河市人才交流中心_登录安全分析报告-Ajax泄漏滑动距离导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

有哪些好用的ai工具,可以提升科研、学习、办公等效率?

最近&#xff0c;Sora的诞生为AI再添了一把火。 据介绍&#xff0c;这款“文生视频”的Sora可以直接输出长达60秒的视频&#xff0c;并且包含高度细致的背景、复杂的多角度镜头&#xff0c;以及富有情感的多个角色。 不仅能准确呈现细节&#xff0c;还能理解物体在物理世界中…

纷享销客BI典型场景案例解析

本章以具体案例来说明纷享销客一体化BI智能分析平台为企业在实际使用过程中带来的价值。 1)场景一&#xff1a;销售经理想要在周会上关注各销售人员的客户及订单情况&#xff0c;并在每周一上午9点可以把上周的整体情况周期性的将报表推送给相关销售人员。 具体图表展示样式及…

开关电源基本原理1

目录 内容概述 关于电感 认识电感 电感充电 电感储能 电感充电 电感参数 电感放电 利用电感升压 电感电流波形 伏秒法则 电流纹波率 电感电流三种导电模式 电流纹波率与频率的关系 电流纹波率与电感值的关系 电感值与电感体积 电路纹波率r的最优值 电感值与电…

【面经】亚信科技面试问题合集

下述内容经搜寻广大平台的面试经历&#xff0c;整理汇合得出&#xff0c;答案来自chatgpt&#xff0c;加黑的地方意味着出现多次。 1.自我介绍 2.介绍项目功能 3.和equals的区别。八大基本类型&#xff08;byte,char,int ,long,double,float,boolean,short) 是用于比较两个…

纷享销客BI智能分析平台常见问题QA

Q1在驾驶舱中查看图表时&#xff0c;图表间有什么动态交互吗? A&#xff1a;驾驶舱支持图表本身下钻&#xff0c;图表间联动&#xff0c;并且支持图表下钻的同时联动&#xff0c;可以基于驾驶舱的这个功能&#xff0c;实现图表间的动态交互。 Q2基于客户主题创建的统计图&…

短视频系列内容生产技能提升 沈阳短视频剪辑培训

优势&#xff1a;一、短视频系列化内容的优势 ①可持续性强 某一条视频效果很好(几十万点赞)时&#xff0c;按照相同格式继续输出非常容易成功: √不需要设计脚本&#xff1b; √不需要重新定制。 √稳定性强&#xff0c; ②节约时间成本和制作成本 举例对标账号&#xf…

Python | mkvirtualenv命令改变虚拟环境存储位置

文章目录 1、问题引入2、解决方式 1、问题引入 使用mkvirtualenv 命令创建虚拟环境时&#xff0c;默认创建位置在C:\Users你的计算机名目录下&#xff0c;采用下面的方式可以修改虚拟环境存储位置&#xff0c;默认创建位置是Python内置写好的&#xff0c;默认是这样的。 2、解…

Java项目:95 springboot班级回忆录的设计与实现

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本管理系统有管理员和用户。 本海滨学院班级回忆录管理员功能有个人中心&#xff0c;用户信息管理&#xff0c;班委信息管理&#xff0c;班级信息管理…