C++初阶——list

一、什么是list

        list是一个可以在序列的任意位置进行插入和删除的容器,并且可以进行双向迭代。list的底层是一个双向链表,双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来,内部保持了顺序。

二、list的构造

构造函数接口说明
list(size_type n,const value_type& val = valur_type())为构造的list,初始化n个空间,并根据第二个参数进行初始化
list()构造空的list
list(const list* x)拷贝构造函数
list(Inputlterator first, Inputlterator last)使用迭代器区间中的元素进行初始化

函数原型:

explicit list ();

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

template <class InputIterator>
  list (InputIterator first, InputIterator last);

list (const list& x);

list的构造使用:

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

int main()
{
	string s("hello world");
	list<int> first;//无参构造
	list<int> second(10, 1);//构造的list中包含10个1
	list<int> third(s.begin() + 5, s.end());//迭代器构造
	list<int> fourth(third);//拷贝构造函数
	return 0;
}

三、list的迭代器

        迭代器,按照访问方式可以分为以下三种:

  • 前向迭代器(Forward Iterators):它支持多次遍历,只能递增不能递减。
  • 双向迭代器(Bidirectional Iterators):与前向迭代器类似,但是既能递增也能递减。
  • 随机迭代器(Random Access Iterators):它支持所有双向迭代器的操作,支持跳过元素,支持下标访问,支持比较操作。

        list的迭代器属于双向迭代器,也就是说list不能像vector和数组那样通过[]进行访问。

函数声明接口说明
begin+endbegin返回第一个元素的迭代器,end返回逻辑上最后一个元素之后的位置
rbegin+rendrbegin返回最后一个元素的迭代器,这个迭代器指向的是理论上位于容器第一个元素之前的元素,即它不指向容器中的任何实际元素。

函数原型为:

iterator begin() noexcept;
const_iterator begin() const noexcept;

iterator end() noexcept;
const_iterator end() const noexcept;

reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;

reverse_iterator rend() nothrow;
const_reverse_iterator rend() const nothrow;

迭代器的使用:

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

int main()
{
	string s("hello world");
	list<char> first(s.begin(), s.end());
	list<char>::iterator it = first.begin();
	list<char>::reverse_iterator r_it = first.rbegin();
	cout << "正向迭代器:";
	while (it != first.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	cout << "反向迭代器:";
	while (r_it != first.rend())
	{
		cout << *r_it << " ";
		++r_it;
	}
}

 输出结果为:

四、list的容量相关

函数声明        接口说明
empty检测list是否为空,是返回true,否则返回false
size返回list中有效节点的个数

函数原型为: 

size_type size() const noexcept;

bool empty() const noexcept;

函数使用:

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

int main()
{
	list<int> first;
	list<int> second(10, 1);
	cout << first.empty() << endl;
	cout << second.empty() << endl;
	cout << first.size() << endl;
	cout << second.size() << endl;
}

五、list的访问

函数声明接口说明
front返回lsit的第一个节点的值的引用
back返回list的最后一个节点的值的引用

函数原型为:

reference front();
const_reference front() const;

reference back();
const_reference back() const;

 函数使用:

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

int main()
{
	string s("hello world");
	list<char> first(s.begin(),s.end());
	cout << first.front() << " " << first.back();
}

 输出结果为:

六、list的修改

函数声明接口说明
push_front在list首元素前插入一个值
pop_front删除list中的第一个元素
push_back在尾部插入一个值
pop_back删除list的最后一个元素
insert在给定的迭代器对应位置插入元素
erase删除迭代器对应的元素
swap交换两个list中的元素

push_front和pop_front

函数原型:

void push_front (const value_type& val);
void push_front (value_type&& val);

void pop_front();

函数使用:

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

int main()
{
	string s("hello world");
	list<char> first(s.begin(),s.end());
	first.push_front('k');
	cout << first.front() << endl;
	first.pop_front();
	cout << first.front() << endl;
}

输出结果:

push_back和pop_back 

函数原型:

void push_back (const value_type& val);
void push_back (value_type&& val);

void pop_back();

函数使用:

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

int main()
{
	string s("hello world");
	list<char> first(s.begin(),s.end());
	first.push_back('k');
	cout << first.back() << endl;
	first.pop_back();
	cout << first.back() << endl;
}

输出结果:

insert函数 

函数原型:

iterator insert (const_iterator position, const value_type& val);
	
iterator insert (const_iterator position, size_type n, const value_type& val);

template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);

函数使用:

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

int main()
{
	string s("hello world");
	list<char> first(s.begin(),s.end());
	first.insert(first.begin(), 'c');
	first.insert(first.begin(), 10, 'c');
	first.insert(first.begin(), s.begin(), s.end());
}

erase函数

函数原型:

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

函数使用:

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

int main()
{
	string s("hello world");
	list<char> first(s.begin(),s.end());
	first.erase(first.begin(), first.end());
}

swap函数

函数原型:

void swap (list& x);

函数使用:

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

int main()
{
	string s("hello world");
	list<char> first(s.begin(),s.begin() + 5);
	list<char> second(s.begin() + 5, s.end());
	first.swap(second);
}

七、list的操作

函数声明接口说明
reverse反转容器中元素的顺序
sort排序list中的元素,默认升序
merge合并两个列表,它们必须是有序的
unique消除列表中的重复元素,必须是有序的
remove移除给定的元素
splice将一个列表中的一个或一部分元素转移到另一个元素中

reverse函数

函数原型:

void reverse() noexcept;

函数使用:

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

int main() {
    list<int> first = { 1, 3, 5 };
    first.reverse();
    for (auto i : first)
    {
        cout << i << " ";
    }
}

输出结果为:

sort函数

函数原型:

void sort();

template <class Compare>
  void sort (Compare comp);

函数使用:

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

int main() {
    list<int> first = { 4,5,2,1,7,5,9 };
    first.sort();//默认升序
    //也可以写成first.sort(less<int>());
    for (auto i : first)
    {
        cout << i << " ";
    }
    cout << endl;
    first.sort(greater<int>());//改为降序
    for (auto i : first)
    {
        cout << i << " ";
    }
}

 输出结果:

merge函数

函数原型

void merge (list& x);

template <class Compare>
  void merge (list& x, Compare comp);

        comp是一个比较函数或比较器,它接受两个参数并返回一个布尔值,指示第一个参数是否应该在排序顺序中排在第二个参数之前。这个比较函数应该产生一个严格的弱排序。该函数将参数列表中序列x中的所有元素合并到当前列表中,同时保持排序顺序。两个列表在合并操作之前都必须根据comp提供的比较标准进行排序。

函数使用:

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

int main() {
    list<int> first= { 1, 3, 5 };
    list<int> second= { 2, 4, 6 };

    // 使用自定义比较函数将 list2 合并到 list1
    first.merge(second, less<int>());

    // 打印合并后的列表
    for (int num : first) {
        cout << num << " ";
    }
    cout << endl;

    // 合并后 list2 应该为空
    if (second.empty()) {
        cout << "合并后second 为空。" << endl;
    }

    return 0;
}

输出结果为:

unique函数

函数原型:

void unique();

template <class BinaryPredicate>
  void unique (BinaryPredicate binary_pred);

函数使用:

#include <list>
#include <iostream>
using namespace std;
int main() {
    std::list<int> first = { 1, 2, 2, 3, 3, 3, 4, 4, 5 };
    first.unique();
    // 打印列表
    for (int num : first) {
        std::cout << num << " ";
    }
    cout << std::endl;

    // 使用带参数版本的 unique 函数
    list<int> second = { 1, 2, 2, 3, 3, 3, 4, 4, 5 };
    second.unique(std::equal_to<int>());
  
    // 打印列表
    for (int num : second) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出结果为:

remove函数

函数原型:

void remove (const value_type& val);

函数使用:

#include <list>
#include <iostream>
using namespace std;
int main() {
    std::list<int> first = { 1, 2, 2, 3, 4, 2, 5 };
    first.remove(2);
    for (int num : first) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

splice函数 

函数原型:

void splice (const_iterator position, list& x);

void splice (const_iterator position, list& x, const_iterator i);

void splice (const_iterator position, list& x,
             const_iterator first, const_iterator last);

代码使用:

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

int main() {
    list<int> first = { 1, 2, 3 };
    list<int> second = { 4, 5, 6 };

    first.splice(first.end(), second);

    cout << "first: ";
    for (int num : first) {
        cout << num << " ";
    }
    cout << endl;

    first.splice(first.end(), first, next(first.begin(), 1));

    cout << "first after moving second element: ";
    for (int num : first) {
        cout << num << " ";
    }
    cout << endl;

    first.splice(second.end(), first, first.begin(), next(first.begin(), 3));

    cout << "second after moving elements: ";
    for (int num : second) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

输出结果为:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

NAT网络工作原理和NAT类型

NAT基本工作流程 通常情况下&#xff0c;某个局域网中&#xff0c;只有路由器的ip是公网的&#xff0c;局域网中的设备都是内网ip&#xff0c;内网ip不具备直接与外部应用通信的能力。 处于内网的设备如何借助NAT来实现访问外网的应用&#xff1f; 对于开启了NAT功能的局域网…

两个方法,取消excel数据隐藏

Excel文件中制作了数据表格&#xff0c;因为有些数据不方便显示但是又不能删掉&#xff0c;大家可能会选择隐藏数据&#xff0c;那么&#xff0c;excel隐藏的部分如何显示出来&#xff1f;今天分享两个方法给大家。 方法一&#xff1a; 选中隐藏的区域&#xff0c;点击右键&a…

【JavaEE进阶】Spring 事务和事务传播机制

目录 1.事务回顾 1.1 什么是事务 1.2 为什么需要事务 1.3 事务的操作 2. Spring 中事务的实现 2.1 Spring 编程式事务(了解) 2.2 Spring声明式事务 Transactional 对比事务提交和回滚的日志 3. Transactional详解 3.1 rollbackFor 3.2 Transactional 注解什么时候会…

npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系

文章目录 作用示例常用选项示例命令注意事项 1、实战举例**解决方法**1. **锁定唯一的 types/node 版本**2. **清理依赖并重新安装**3. **设置 tsconfig.json 的 types**4. **验证 Promise 类型支持** **总结** npm list types/node 命令用于列出当前项目中 types/node 包及其…

【靶点Talk】BCMA疗法能否成为下一个掘金点?

BCMA是一种极其重要的B细胞生物标志物&#xff0c;广泛存在于MM细胞表面&#xff0c;近年来已成为MM和其他血液系统恶性肿瘤的一个非常热门的免疫治疗靶点。今天靶点科普给大家带来BCMA作用机制和临床研究进展&#xff1a; 1 BCMA的“简历” B细胞成熟抗原(BCMA&#xff0c;又…

Linux 网络编程

网络编程&#xff1a;OSI 七层模型、TCP 协议、UDP 协议、三次握手、四次挥手、socket编程及编程实战 // 掌握网络编程&#xff0c;TCP、UDP等&#xff0c;socket函数编程 前置知识&#xff1a; 网络通信 网络通信本质上是一种进程间通信&#xff0c;是位于网络中不同主机上的进…

中文核心期刊论文模板免费下载

大家好&#xff0c;今天我要和大家分享一个对学术研究人员非常有帮助的资源——中文核心期刊论文模板。这个模板严格遵循中文核心期刊的出版标准&#xff0c;旨在帮助作者按照期刊的基本格式和内容要求撰写论文&#xff0c;确保论文结构清晰、规范&#xff0c;从而提高投稿效率…

Linux之DNS服务器

一、DNS 简介 定义与作用&#xff1a;DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;作为将域名和 IP 地址相互映射的分布式数据库&#xff0c;使人更方便地访问互联网。使用 53 端口&#xff0c;通常以 UDP 查询&#xff0c;未查到完整信息…

已解决:spark代码中sqlContext.createDataframe空指针异常

这段代码是使用local模式运行spark代码。但是在获取了spark.sqlContext之后&#xff0c;用sqlContext将rdd算子转换为Dataframe的时候报错空指针异常 Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.Nu…

物联网低功耗广域网LoRa开发(一):LoRa物联网行业解决方案

一、LoRa的优势以及与其他无线通信技术对比 &#xff08;一&#xff09;LoRa的优势 1、164dB链路预算 、距离>15km 2、快速、灵活的基础设施易组网且投资成本较少 3、LoRa节点模块仅用于通讯电池寿命长达10年 4、免牌照的频段 网关/路由器建设和运营 、节点/终端成本低…

【2024最新】渗透测试工具大全(超详细),收藏这一篇就够了!

【2024最新】渗透测试工具大全&#xff08;超详细&#xff09;&#xff0c;收藏这一篇就够了&#xff01; 黑客/网安大礼包&#xff1a;&#x1f449;基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 所有工具仅能在取得足够合…

Redis - 哨兵(Sentinel)

Redis 的主从复制模式下&#xff0c;⼀旦主节点由于故障不能提供服务&#xff0c;需要⼈⼯进⾏主从切换&#xff0c;同时⼤量 的客⼾端需要被通知切换到新的主节点上&#xff0c;对于上了⼀定规模的应⽤来说&#xff0c;这种⽅案是⽆法接受的&#xff0c; 于是Redis从2.8开始提…

双十二入手什么比较划算?双十二母婴好物推荐

随着双十二购物狂欢节的临近&#xff0c;双十二入手什么比较划算&#xff1f;许多准父母和有小孩的家庭都在寻找最佳的母婴产品优惠。在这个特别的日子里&#xff0c;各大电商平台都会推出一系列针对母婴用品的折扣和促销活动&#xff0c;使得这个时期成为囤货和更新宝宝生活必…

[运维][Nginx]Nginx学习(1/5)--Nginx基础

Nginx简介 背景介绍 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】&#xff0c;同时也是一个【POP3/SMTP/IMAP代理服务器】&#xff0c;是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的&#xff0c;Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一…

手动安装Ubuntu系统中的network-manager包(其它包同理)

自己手闲把系统中的network-manager包给删了&#xff0c;导致的结果就是Ubuntu系统彻底没有网络。结果再装network-manager时&#xff0c;没有网络根本装不了&#xff0c;网上的方法都试了也没用&#xff0c;然后就自己源码装&#xff0c;这篇文章就是记录一下怎么手动下载包然…

【 ElementUI 组件Steps 步骤条使用新手详细教程】

本文介绍如何使用 ElementUI 组件库中的步骤条组件完成分步表单设计。 效果图&#xff1a; 基础用法​ 简单的步骤条。 设置 active 属性&#xff0c;接受一个 Number&#xff0c;表明步骤的 index&#xff0c;从 0 开始。 需要定宽的步骤条时&#xff0c;设置 space 属性即…

Java项目实战II基于微信小程序的童装商城(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于微信小…

基于Cocos Creator开发的打砖块游戏

一、简介 Cocos简而言之就是一个开发工具&#xff0c;详见官方网站TypeScript简而言之就是开发语言&#xff0c;是JavaScript的一个超集详解官网 今天我们就来学习如何写一个打砖块的游戏&#xff0c;很简单的一个入门级小游戏。 二、实现过程 2.1 布局部分 首先来一个整体…

BigDecimal 详解

《阿里巴巴 Java 开发手册》中提到&#xff1a;“为了避免精度丢失&#xff0c;可以使用 BigDecimal 来进行浮点数的运算”。 浮点数的运算竟然还会有精度丢失的风险吗&#xff1f;确实会&#xff01; 示例代码&#xff1a; float a 2.0f - 1.9f; float b 1.8f - 1.7f; Sys…