【STL】C++ list 基本使用

news2024/11/16 3:49:44

目录

一 list 常见构造

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

2 Fill 构造函数

3 Range 构造函数

4 拷贝构造函数

二 list迭代器

1 begin && end

2 rbegin && rend

三 list 容量操作

四 list 修改操作

1 assign 

2  push_front && pop_back

3 push_back && pop_back

4  insert

5 erase

6 swap

7. resize

8 clear

9 关于 emplace系列操作说明

五 list 元素访问

六 其他操作

1 splice

2 remove

3 unique

4 sort

5  reverse 

七 总结 


一 list 常见构造

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

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

2 Fill 构造函数

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

3 Range 构造函数

构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都按相同的顺序从该范围中的相应元素构造而成。

4 拷贝构造函数

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

#include<iostream>
#include<list>
using namespace std;

void Print(list<int>& lt)
{
	list<int>:: iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

int main()
{
	list<int> a;

	list<int> b(4, 100);
	list<int> c(4);
	list<int> d(b.begin(), b.end());
	list<int> e(b);

	cout << "b: ";
	Print(b);

	cout << "c: ";
	Print(c);

	cout << "d: ";
	Print(d);

	cout << "e: ";
	Print(e);

	return 0;
}

C++11构造

void Print(list<int>& lt)
{
	list<int>:: iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}


int main()
{
	list<int> lt1{ 1, 2, 3, 4, 5 };
	Print(lt1);
	return 0;
}

 

二 list迭代器

list模式和vector如出一辙

注意:

ist的迭代器是支持++--操作的(前后缀都支持)
但是不支持+-操作,因为链表不能进行随机访问操作,只能O(n)查询

1 begin && end

iterator begin();const_iterator begin() const;
iterator end();const_iterator end() const;
void Test3()
{
    list<int> lt(4, 1);
    list<int>::iterator it = lt.begin();
    while (it != lt.end())
    {
        cout << *it << ' ';
        ++it;
    }
    cout << endl;

    const list<int> llt(4, 10);
    list<int>::const_iterator itt = llt.begin();
    while (itt != llt.end())
    {
        cout << *itt << ' ';
        ++itt;
    }

}

2 rbegin && rend

reverse_iterator rbegin();const_reverse_iterator rbegin() const;
reverse_iterator rend();const_reverse_iterator rend() const;
void Test4()
{
    list<int> lt(5);
    list<int>::reverse_iterator it = lt.rbegin();
    int i = 1;
    while (it != lt.rend())
    {
        *it += i;
        ++it;
        ++i;
    }
    for (auto e : lt)
    {
        cout << e << ' ';
    }

}

三 list 容量操作

 这里直接代码演示

void Test5()
{
    list<int> lt1;
    if (lt1.empty()) cout << "empty" << endl;
    else cout << "full" << endl;

    list<int> lt2{ 1, 2, 3, 4 };
    cout << "lt1: " << lt1.size() << "  lt2: " << lt2.size() << endl;
}

四 list 修改操作

1 assign 

将新内容分配给 list 容器,替换其当前内容,并相应地修改其大小。

range (1)	
template <class InputIterator>  void assign (InputIterator first, InputIterator last);
fill (2)	
void assign (size_type n, const value_type& val);
void Test6()
{
    std::list<int> first;
    std::list<int> second;

    first.assign(7, 100);                      

    second.assign(first.begin(), first.end()); 

    int myints[] = {1776,7,4 };
    first.assign(myints, myints + 3);            

    cout << "first: ";
    for (auto e : first)
    {
        cout << e << " ";
    }
    cout << endl;

    cout << "second: ";
    for (auto e : second)
    {
        cout << e << " ";
    }
    cout << endl;
}

2  push_front && pop_back

void push_front (const value_type& val);
void pop_front();
void Test7()
{
    list<int> lt = { 1, 2 };
    lt.push_front(100);
    for (auto e : lt)
    {
        cout << e << " ";
    }
    cout << endl;

    lt.pop_front();
    for (auto e : lt)
    {
        cout << e << " ";
    }
    cout << endl;
}

3 push_back && pop_back

void push_back (const value_type& val);
void pop_back();
void Test8()
{
    list<int> lt = { 1, 2 };
    lt.push_back(100);
    for (auto e : lt)
    {
        cout << e << " ";
    }
    cout << endl;

    lt.pop_back();
    for (auto e : lt)
    {
        cout << e << " ";
    }
    cout << endl;
}

4  insert

指定位置的元素之前插入新元素来扩展容器,从而有效地通过插入的元素数增加容器大小

single element (1)	
iterator insert (iterator position, const value_type& val);

fill (2)	
    void insert (iterator position, size_type n, const value_type& val);

range (3)	
template <class InputIterator>    void insert (iterator position, InputIterator first, InputIterator last);
void Test9()
{
   
    list<int> lt(4, 10);
    lt.insert(lt.begin(), 100);
    for (auto e : lt)
    {
        cout << e << ' ';
    }
    cout << endl;

    lt.insert(lt.end(), 4, 100);
    for (auto e : lt)
    {
        cout << e << ' ';
    }

    cout << endl;
    
}

5 erase

从容器中删除单个元素 (position) 或一系列元素 ( [first,last))

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
void Test10()
{
    list<int> lt{ 1, 2, 3, 4, 5, 6};
    lt.erase(lt.begin());
    for (auto e : lt)
    {
        cout << e << ' ';
    }

    cout << endl;

    lt.erase(++lt.begin(), lt.end());
    for (auto e : lt)
    {
        cout << e << ' ';
    }
}

6 swap

 通过 x 的内容交换容器的内容,x 是另一个相同类型的容器对象。size可能有所不同。

void swap (list& x);
void Test11()
{
    
    list<int> l1(4, 10);
    list<int> l2(4, 1);
    l1.swap(l2);

    cout << "l1: ";
    for (auto e : l1)
    {
        cout << e << ' ';
    }
    cout << endl;

    cout << "l2: ";
    for (auto e : l2)
    {
        cout << e << ' ';
    }  
}

7. resize

调整容器的大小,使其包含 n 个元素。

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

如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出(并销毁它们)的元素。

如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到 n 的大小。

如果指定了 val,则新元素将初始化为 val 的副本,否则,它们将进行值初始化(0)。

void Test12()
{
    list<int> mylist;
    for (int i = 1; i < 10; ++i) mylist.push_back(i);

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

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

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

}

8 clear

 从容器中删除所有元素(这些元素被销毁),使容器的大小为0。

void clear() noexcept;
void Test13()
{
    list<int> lt(1, 4);


    lt.clear();
    cout << lt.size() << endl;

    for (auto e : lt)
    {
        cout << e << ' ';
    }
    cout << endl;
}

9 关于 emplace系列操作说明

这个系列的操作放在 右值引用讲解完之后再讲, 这样才能更好的理解. 大家不需要着急的, 因为 上面讲的完全够用, 而且emplace 是优化, 并不是其他功能

五 list 元素访问

 

void Test13()
{
    list<int> lt{ 1, 2, 3, 4 };

    cout << lt.front() << endl;
    cout << lt.back() << endl;
}

六 其他操作

1 splice

将元素从一个列表转移到另一个列表

void splice(iterator position, list& x);
将 x 的所有元素转移到容器中
  
void splice(iterator position, list& x, iterator i);
仅将 i 指向的元素从 x 传输到容器中

void splice(iterator position, list& x, iterator first, iterator last);
将范围 [first,last) 从 x 传输到容器中。
void Test14()
{
    list<int> mylist1 = { 1, 2, 3, 4 }, mylist2 = { 10, 20, 30 };
    list<int>::iterator it = mylist1.begin();
    ++it;         // points to 2

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

    cout << "mylist1:  ";
    for (auto e : mylist1)
    {
        cout << e << " ";
    }
    cout << endl;

    cout << "mylist2:  ";
    for (auto e : mylist2)
    {
        cout << e << " ";
    }
    cout << endl;

    mylist2.splice(mylist2.begin(), mylist1, mylist1.begin());
    cout << "mylist1:  ";
    for (auto e : mylist1)
    {
        cout << e << " ";
    }
    cout << endl;

    cout << "mylist2:  ";
    for (auto e : mylist2)
    {
        cout << e << " ";
    }
    cout << endl;


    mylist1.splice(mylist1.begin(), mylist2, mylist2.begin(), mylist2.end());
    cout << "mylist1:  ";
    for (auto e : mylist1)
    {
        cout << e << " ";
    }
    cout << endl;

    cout << "mylist2:  ";
    for (auto e : mylist2)
    {
        cout << e << " ";
    }
    cout << endl;
}

2 remove

从容器中删除所有与 val相等的元素。这将调用这些对象的析构函数,并通过删除的元素数来减小容器大小。

vvoid remove (const value_type& val);
int main()
{
       list<int> lt;
       lt.push_back(1);
       lt.push_back(2);
       lt.push_back(2);
       lt.push_back(4);
       lt.push_back(5);
       cout << lt.size() << endl;

       lt.remove(2);

       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;
       cout << lt.size() << endl;
       return 0;
}

3 unique

从容器中每个连续的相等元素组中删除除第一个元素之外的所有元素。请注意,只有当某个元素与其前面的元素相等时,该元素才会从列表容器中删除。因此,此函数对于排序列表特别有用。

void unique();
int main()
{
       list<int> lt;
       lt.push_back(1);
       lt.push_back(1);
       lt.push_back(2);
       lt.push_back(4);
       lt.push_back(2);
       lt.push_back(2);
       lt.push_back(4);
       lt.push_back(3);

       lt.push_back(5);

       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;

       lt.sort();//需要先排序
       lt.unique();
       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;

       return 0;
}

4 sort

对容器中的元素进行排序

对列表 中的元素进行排序,改变它们在容器中的位置。

void sort();
void Test15()
{
    list<int> lt{ 2, 1, 2, 4, 10, 11, 99, 88 };
    lt.sort();
    for (auto e : lt)
    {
        cout << e << " ";
    }

}

5  reverse 

反转列表容器 中元素的顺序

void reverse()void reverse()
int main()
{
       list<int> lt;
       lt.push_back(1);
       lt.push_back(2);
       lt.push_back(3);
       lt.push_back(4);
       lt.push_back(5);
       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;
       lt.reverse();

       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;
       return 0;
}

七 总结 

list终于抽时间写完了, 首先本节大多数代码实验, 理论讲解少, 还是那句话, 如果对概念不清楚, 请到 string看, 或者翻阅文档, 这些都是最基本的素养.  list 很多操作和 vector一样的, 但也有差别, 注意区分即可.

今天去中医看病, 医生说 眼睛就是你的肾, 舌头是你的心脏, 大家一定注意饮食规律, 不要久坐啊.

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

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

相关文章

【RuoYi】如何启动RuoYi项目

一、前言 最近&#xff0c;在做一个管理系统的项目&#xff0c;接触到了RuoYi这个前后端分离的框架&#xff0c;自己是第一次接触这个框架&#xff0c;所以刚开始有点好奇&#xff0c;在用该框架写了一些代码后。发现RuoYi这个框架做的真的好&#xff0c;它包含了权限管理和一些…

Petalinux 制作ZYNQ镜像文件流程

1概述 在Zynq-7000 SoC中搭建运行Linux&#xff0c;嵌入式软件栈。 处理器系统引导是一个分两个阶段的过程。第一个阶段是一个内部 BootROM&#xff0c;它存储 stage-0 的引导代码。BootROM 在 CPU 0 上执行&#xff0c;CPU 1 执行等待事件&#xff08;WFE&#xff09;指令。…

WordPress|子比主题美化-给首页左侧添加联系站长按钮

WordPress子比主题美化-给首页左侧添加联系站长按钮 5ccy.cn 我创创业-副业资源整合网-网络赚钱-网络创业-资源分享 http://5ccy.cn 效果如下: 功能介绍 联系站长图标的作用主要是为用户提供一种便捷的方式&#xff0c;以与网站的管理员或站长取得联系。这个图标一般放置在网…

cocos creator做圆形进度条

效果图&#xff1a; 我们在开发过程中经常要用到圆形进度条&#xff0c;例如技能CD 原文链接 之前写了一篇cocos2dx-lua_ProgressTimer创建扇形进度条,这里简单记录下在cocosCreator中如何制作。 具体方法 cocosCreator做起来比2dx还是要简单很多&#xff0c;首先给节点添加p…

Java 类加载机制解密一探到底

类加载是 Java 程序在运行期执行之前的重要环节&#xff0c;它决定着程序的运行效率和稳定性。本文将为您深入剖析 Java 类加载机制的整个生命周期&#xff0c;揭开神秘面纱&#xff0c;让您彻底掌握这一核心知识点。 一、类的生命周期概述 类的生命周期在Java中指的是从类被加…

大疆mic、罗德、西圣无线麦克风怎么选?大疆、西圣麦克风测评对比

如今是一个短视频飞速发展的时代&#xff0c;越来越多自媒体人通过短视频的方式来进行直播带货、生活Vlog、线上K歌等&#xff0c;记录下生活里种种美丽的瞬间。不过一个好的视频除了要有巧妙的构思和清晰稳定的拍摄外&#xff0c;干净的声音也是必不可少的部分。短视频归根结底…

飞控如何和接收机接线?

飞控如何和接收机接线&#xff1f; 一般遥控都是按照顺序1对1接到飞控的INPUT端口。特别注意&#xff0c;华科尔的接收机&#xff0c;需要把1和2通道条换过来。 具体方法如下&#xff1a; 下面以MC6遥控接收机为例子&#xff1a; 用下面的图的接收机连接线来演示&#xff1a…

06.部署jpress

安装mariadb数据 yum -y install mariadb-server #启动并设置开启自启动 systemctl start mariadb.service systemctl enable mariadb.service数据库准备 [rootweb01 ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id…

React-入门

React由Meta公司研发&#xff0c;是一个用于构建Web和原生交互界面的库 既可以写基于浏览器的应用&#xff0c;还可以写苹果和安卓的原生应用 优势 开发环境搭建 create-react-app是一个快速创建React开发环境的工具&#xff0c;底层是由Webpack构建&#xff0c;封装了配置细…

SAP后续借记、后续贷记、贷方凭证的应用介绍

SAP-MM模块中发票校验MIRO,对于做采购或财务相关的用户都应该非常熟悉,可能每天都需要进行这业务操作处理,但是在发票校验的系统界面中,有三个使用不是很频繁的功能(如下图红色框)。 对于这三业务功能曾听有些用户抱怨SAP怎么那么麻烦啊,不就是补偿或扣供应商的钱嘛,我…

Bookie存储架构源码剖析|得物技术

一、Pulsar存储架构简析 Pulsar作为新一代MQ中间件&#xff0c;在底层架构设计上充分贯彻了存算分离的思想&#xff0c;broker与Bookeeper两个组件独立部署&#xff0c;前者负责流量的调度、聚合、计算&#xff0c;后者负责数据的存储&#xff0c;这也契合了云原生下k8s大行其…

【ARM+Codesys案例】树莓派+Codesys软PLC方案在包装行业灌装旋盖机的应用

ARM系列支持&#xff1a;全志T3、RK3568、树莓派 机型定义&#xff1a;双工位旋盖机 旋盖机主要适用于不同规格的材质及不同规格的盖、旋&#xff08;轧&#xff09;盖。适用螺旋盖、防盗盖、防撞盖、压入盖等。压力可方便调整&#xff0c;根据瓶盖大小设置取盖位。结构紧凑、…

Java基础入门day56

day56 现有问题 之前的servlet中&#xff0c;服务器通过Servlet响应客户端页面的不足&#xff1a; 开发方式麻烦&#xff1a;继承父类或者实现接口&#xff0c;覆盖方法&#xff0c;配置注册 代码修改麻烦&#xff1a;一旦代码修改&#xff0c;需要重新编译、部署、重启服务 …

Linux汉化Jupyter Notebook

要在Linux系统中使Jupyter Notebook汉化&#xff0c;可以通过安装jupyterlab-language-pack-zh-CN扩展来实现。以下是具体步骤和示例代码&#xff1a; 打开终端。 执行以下命令以安装Jupyter Notebook的中文语言包&#xff1a; pip install jupyterlab-language-pack-zh-CN …

nbcio-vue升级迁移flowable到最新的jeeg-boot-vue3的问题记录(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、vue3 jeeg-boot-vue3新版本的流程定义的页面&#xff0c;刷新出现下面问题&#xff0c;或第一次进去也一样 看着好像就一个警告的信息&#xff0c;不知道是什么原因引起的&#xff0c;应…

HTML静态网页成品作业(HTML+CSS)——家乡沅陵介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

# WIN10/WIN11 找不到【应用商店 Microsoft.WindowsStore】怎么办?

WIN10/WIN11 找不到【应用商店 Microsoft.WindowsStore】怎么办&#xff1f; 解决方法&#xff1a; 1、右键【开始】菜单&#xff0c;点击【Windows PowerShell (管理员)】&#xff0c;输入&#xff1a; Get-AppxPackage -allusers | Select Name, PackageFullName 2、查询…

python 办公自动化-生成ppt文本和图

最终样式 代码实现 # 可编辑折线+写入文字 成功 # 问题: 设置字体类型和加粗和字体为微软雅黑,是只改了字母和数字的字体,中文没变化 pip install pptx_ea_font 这个库可以解决这个问题 import pandas as pd import pptx_ea_font import matplotlib.pyplot as plt from pp…

【基础算法总结】前缀和二

前缀和二 1.和为 K 的子数组2.和可被 K 整除的子数组3.连续数组4. 矩阵区域和 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.和为 K 的子数…

记录一次内存取证

1.情景复现 我姐姐的电脑坏了。我们非常幸运地恢复了这个内存转储。你的工作是从系统中获取她所有的重要文件。根据我们的记忆&#xff0c;我们突然看到一个黑色的窗口弹出&#xff0c;上面有一些正在执行的东西。崩溃发生时&#xff0c;她正试图画一些东西。这就是我们从崩溃…