STL-常用容器-list

news2024/10/29 1:08:12

1list基本概念

**功能:**将数据进行链式存储

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列结点组成
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表
在这里插入图片描述
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:

  • 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。

总结:STL中List和vector是两个最常被使用的容器,各有优缺点

2 list构造函数

功能描述:

  • 创建list容器

函数原型:

  • list<T> lst; //list采用采用模板类实现,对象的默认构造形式:
  • list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。
  • list(n,elem); //构造函数将n个elem拷贝给本身。
  • list(const list &lst); //拷贝构造函数。
#include<iostream>
using namespace std;
#include<list>


void printList(const list<int>& L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	list<int>L1;

	//添加数据
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	L1.push_back(40);

	//遍历
	printList(L1);

	//区间方式构造
	list<int>L2(L1.begin(), L1.end());
	printList(L2);

	//拷贝构造
	list<int>L3(L2);
	printList(L3);

	//n个nlem
	list<int>L4(2, 100);
	printList(L4);

}

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

总结:list构造方式同其他几个STL常用容器,熟练掌握即可

3 list 赋值和交换

功能描述:

  • 给list容器进行赋值,以及交换list容器

函数原型:

  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
  • assign(n, elem); //将n个elem拷贝赋值给本身。
  • list& operator=(const list &lst); //重载等号操作符
  • swap(lst); //将lst与本身的元素互换
#include<iostream>
using namespace std;
#include<list>


void printList(const list<int>& L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	list<int>L1;

	//添加数据
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	L1.push_back(40);

	//遍历
	printList(L1);

	list<int>L2;
	L2 = L1;
	printList(L2);

	list<int>L3;
	L3.assign(L2.begin(), L2.end());

	list<int>L4;
	L4.assign(2, 100);
}

void test02()
{
	list<int>L1;

	//添加数据
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	L1.push_back(40);

	list<int>L2;
	L2.assign(4, 20);
	cout << "交换前:";
	printList(L1);
	printList(L2);
	L1.swap(L2);
	cout << "交换后:";
	printList(L1);
	printList(L2);
}


int main()
{
	//test01();
	test02();
	return 0;
}

4 list 大小操作

功能描述:

  • 对list容器的大小进行操作

函数原型:

  • size(); //返回容器中元素的个数

  • empty(); //判断容器是否为空

  • resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

    ​ //如果容器变短,则末尾超出容器长度的元素被删除。

  • resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
    //如果容器变短,则末尾超出容器长度的元素被删除

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


void printList(const list<int>& L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	list<int>L1;

	//添加数据
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	L1.push_back(40);

	//遍历
	printList(L1);

	//判断容器是否为空
	if (L1.empty())
	{
		cout << "为空" << endl;
	}
	else
	{
		cout << "不空" << endl;
		cout << L1.size() << endl;
	}

	//重新指定大小
	L1.resize(6, 66);
	printList(L1);

	L1.resize(2);
	printList(L1);
}


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

总结:

  • 判断是否为空 — empty
  • 返回元素个数 — size
  • 重新指定个数 — resize

5 list 插入和删除

功能描述:

  • 对list容器进行数据的插入和删除

函数原型:

  • push_back(elem);//在容器尾部加入一个元素
  • pop_back();//删除容器中最后一个元素
  • push_front(elem);//在容器开头插入一个元素
  • pop_front();//从容器开头移除第一个元素
  • insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
  • clear();//移除容器的所有数据
  • erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos);//删除pos位置的数据,返回下一个数据的位置。
  • remove(elem);//删除容器中所有与elem值匹配的元素。
#include<iostream>
using namespace std;
#include<list>


void printList(const list<int>& L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	list<int>L;

	//尾插
	L.push_back(10);
	L.push_back(20);
	L.push_back(30);
	L.push_back(40);
	//头插
	L.push_front(100);
	L.push_front(200);

	printList(L);

	//尾删
	L.pop_back();
	printList(L);

	//头删
	L.pop_front();
	printList(L);

	//insert
	list<int>::iterator it = L.begin();
	L.insert(++it, 66);
	printList(L);

	//删除
	it = L.begin();
	L.erase(it);
	printList(L);

	//移除
	L.push_back(22);
	printList(L);
	L.remove(22);
	printList(L);

	L.clear();
	printList(L);
}


int main()
{
	test01();

	return 0;
}

总结:

  • 尾插 — push_back
  • 尾删 — pop_back
  • 头插 — push_front
  • 头删 — pop_front
  • 插入 — insert
  • 删除 — erase
  • 移除 — remove
  • 清空 — clear

6 list 数据存取

功能描述:

  • 对list容器中数据进行存取

函数原型:

  • front(); //返回第一个元素。
  • back(); //返回最后一个元素。
#include<iostream>
using namespace std;
#include<list>


void test01()
{
	list<int>L1;

	//尾插
	L1.push_back(10);
	L1.push_back(20);
	L1.push_back(30);
	L1.push_back(40);
	
	//L[0] 不可以用[]访问list容器中的元素
	//L1.at(0) 不可以用at访问list容器中的元素
	//list 本身是一个链表,地址不连续,迭代器不支持随机访问

	cout << "第一个元素" << L1.front() << endl;
	cout << "最后一个元素" << L1.back() << endl;

	//验证迭代器不支持随机访问
	list<int>::iterator it = L1.begin();
	it++;//it=it+1 不支持
	
}


int main()
{
	test01();

	return 0;
}

总结:

  • list容器中不可以通过[]或者at方式访问数据
  • 返回第一个元素 — front
  • 返回最后一个元素 — back

7 list 反转和排序

功能描述:

  • 将容器中的元素反转,以及将容器中的数据进行排序

函数原型:

  • reverse(); //反转链表
  • sort(); //链表排序
#include<iostream>
using namespace std;
#include<list>
#include<algorithm>
void printList(const list<int>& L)
{
	for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

bool myCompare(int v1,int v2)
{
	return v1 > v2;
}

void test01()
{
	list<int>L1;

	//尾插
	L1.push_back(20);
	L1.push_back(10);
	L1.push_back(60);
	L1.push_back(40);

	printList(L1);

	L1.reverse();
	printList(L1);

	L1.sort();
	printList(L1);
	//sort(L1.begin(), L1.end()); 所有不支持随机访问迭代器的容器,不可以用标准算法

	L1.sort(myCompare);
	printList(L1);
}


int main()
{
	test01();

	return 0;
}

总结:

  • 反转 — reverse
  • 排序 — sort (成员函数)

8 排序案例

案例描述:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高

排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序

#include<iostream>
using namespace std;
#include<string>
#include <list>
class Person
{
public:
	Person(string name, int age, int h)
	{
		this->_name = name;
		this->_age = age;
		this->_h = h;
	}
	string _name;
	int _age;
	int _h;
};

bool comparePerson(Person& p1, Person& p2)
{
	if (p1._age == p2._age)
	{
		return p1._h > p2._h;
	}
	return p1._age < p2._age;
}

void test01()
{
	list<Person>L;
	Person p1("li", 20, 170);
	Person p2("yi", 18, 176);
	Person p3("ai", 17, 169);
	Person p4("wu", 22, 173);
	Person p5("hi", 20, 178);

	L.push_back(p1);
	L.push_back(p2);
	L.push_back(p3);
	L.push_back(p4);
	L.push_back(p5);

	for (list<Person>::const_iterator it = L.begin(); it != L.end(); it++)
	{
			cout << "姓名:" << (*it)._name << " 年龄: " << it->_age << " 身高:" << it->_h << endl;;
	}
	cout << "--------------------" << endl;
	cout << "排序后" << endl;
	L.sort(comparePerson);
	for (list<Person>::const_iterator it = L.begin(); it != L.end(); it++)
	{
		cout << "姓名:" << (*it)._name << " 年龄: " << it->_age << " 身高:" << it->_h << endl;;
	}
}

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

总结:

  • 对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序

  • 高级排序只是在排序规则上再进行一次逻辑规则制定,并不复杂

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

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

相关文章

如何将 PDF 转换成JPG图片?这里有4个详细指南

通常情况下&#xff0c;图片文件比 PDF 文件加载速度更快&#xff0c;所以如果将PDF转换成图片的格式&#xff0c;或更容易分享以及浏览。所以&#xff0c;今天就教大家4个方法&#xff0c;帮助大家快速的进行PDF和JPG图片之间的转换。 1、PDF转换大师 直通车&#xff1a;www.…

深度学习超参数调优指南

文章目录 深度学习超参数调优指南一、超参数相关基础知识1. 神经网络中包含哪些超参数2. 超参数的重要性顺序3. 部分超参数如何影响模型性能4. 部分超参数合适的范围 二、超参数调整技巧1. 如何选择激活函数2. 如何调整 Batch Size3. 如何调整学习率 三、自动调参方法1. 网格搜…

【JIT/极态云】技术文档--函数设计

一、简介 函数是计算机编程中非常重要的概念。它是一段代码&#xff0c;可以在程序中多次调用&#xff0c;用于完成特定的任务。 函数通常接受输入参数&#xff0c;执行特定的操作&#xff0c;并返回一个结果。这个结果可以被程序中的其他代码使用。 二、新建函数 在函数列表…

Ubuntu下Mysql修改默认存储路径

首先声明&#xff0c;亲身经验&#xff0c;自己实践&#xff0c;网上百度了好几个帖子&#xff0c;全是坑&#xff0c;都TMD的不行&#xff0c;修改各种配置文件&#xff0c;就是服务起不来&#xff0c;有以下几种配置文件需要修改 第一个文件/etc/mysql/my.cnf 这个文件是存…

【论文阅读】FUNNELRAG:一个从粗到精的逐级检索范式

论文地址&#xff1a;https://arxiv.org/abs/2410.10293 github&#xff1a; 研究背景 现有的检索范式存在两个主要问题&#xff1a;一是平铺检索(flat retrieval)对单个检索器造成巨大负担&#xff1b;二是恒定粒度(constant granularity)限制了检索性能的上限。研究难点在于…

map 和 set 的使用

文章目录 一.序列式容器和关联式容器二. set 系列的使用1. set 和 multiset 参考文档2. set 类介绍3. set 的构造和迭代器4. set 的增删查5. insert 和迭代器遍历使用样例6. find 和 erase 使用样例7. multiset 和 set 的差异 三. map 系列的使用1. map 和 multimap参考文档2. …

11张思维导图带你快速学习java

简介 Java是一种跨平台的编程语言&#xff0c;广泛应用于开发各种类型的应用程序。从零开始学习Java可能会感到困惑&#xff0c;因为Java拥有广泛的功能和概念。为了更好地学习和理解Java&#xff0c;可以使用思维导图来整理和归纳Java的主要概念和特点。思维导图可以帮助学习…

iOS 18.2开发者预览版 Beta 1版本发布,欧盟允许卸载应用商店

苹果今天为开发人员推送了iOS 18.2开发者预览版 Beta 1版本 更新&#xff08;内部版本号&#xff1a;22C5109p&#xff09;&#xff0c;本次更新距离上次发布 Beta / RC 间隔 2 天。该版本仅适用于支持Apple Intelligence的设备&#xff0c;包括iPhone 15 Pro系列和iPhone 16系…

算法通关--单调栈

单调栈 单调栈是在栈的先进后出的规则基础上&#xff0c;要求从栈底到栈顶的元素满足单调的关系。如果是大压小&#xff0c;那么从栈顶观察是递减栈&#xff0c;如果是小压大&#xff0c;那么从栈顶观察使递减栈 经典用法&#xff1a; 判断一个数组每个位置都求&#xff1a;…

性价比高的宠物空气净化器选购指南,双十一有哪几款值得购买?

养猫家庭注意养猫家庭注意&#xff0c;换毛季它又来啦&#xff01;不管你家猫是多么瘦小&#xff0c;这个时候都会变成一年两次限定的蒲公英小猫。这都是因为它在疯狂的掉毛&#xff0c;没来得及清理的毛发就留在身上&#xff0c;不断堆积&#xff0c;家里也到处都是它掉落的猫…

医学影像学基础:理解CT、MRI、X射线和超声等医学影像设备的基本工作原理和成像技术

目录 医学影像学基础 1. X射线成像 2. 计算机断层扫描&#xff08;CT&#xff09; 3. 磁共振成像&#xff08;MRI&#xff09; 4. 超声成像 综合对比 1、成像原理对比 2、安全性对比 3、应用领域对比 4、设备特点对比 总结 医学影像学基础 在医学影像学中&#xff0…

TCP simultaneous open测试

源代码 /*************************************************************************> File Name: common.h> Author: hsz> Brief:> Created Time: 2024年10月23日 星期三 09时47分51秒**********************************************************************…

windows录屏软件工具推荐!!

如今&#xff0c;科技的进步&#xff0c;互联网的普及&#xff0c;使我们的生活越来越便利&#xff0c;录屏工具的出现&#xff0c;大大提高我们的工作效率。如果你经常需要录制屏幕上的内容&#xff0c;比如制作教学视频、游戏实况记录、演示文稿等等&#xff0c;那这几款软件…

“令牌化”革命:数据货币化如何重塑企业竞争格局

在科技日新月异的今天&#xff0c;英伟达CEO黄仁勋在Gartner IT研讨会/XPO大会上的主题演讲无疑为企业创业者们提供了一场思想的盛宴。作为科技行业的领军企业&#xff0c;英伟达不仅在图形处理器&#xff08;GPU&#xff09;领域取得了巨大成功&#xff0c;更在人工智能&#…

前端新人手册:入职第一天的环境配置秘籍

在前端开发的世界里&#xff0c;一个高效、稳定的开发环境是高效工作的基石。它不仅能够提升你的工作效率&#xff0c;还能帮助你更快地适应团队的工作节奏。本文将详细介绍前端开发需要具备的环境及工具。 开发环境 Node.js 通常我们的前端项目都是依赖Node.js环境的&#…

JavaScript入门中-流程控制语句

本文转载自&#xff1a;https://fangcaicoding.cn/article/52 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验&#xff0c;截止目前面试过近200位候选人&#xff0c;主导过单表上10亿、累计上100亿数据…

C++ 日志管理 spdlog 使用笔记

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 常用语句 Part.II 使用Chap.I 简单使用Chap.II 自定义日志格式 Part.III 问题&解决方案Chap.I 如果文件存在则删除 Reference Part.I Introduction spdlog 是一个开源的 C 日志管理工具&#xff0c;Git 上面的地址为 …

Ovis原理解读: 多模态大语言模型的结构嵌入对齐

论文&#xff1a;https://arxiv.org/pdf/2405.20797 github:https://github.com/AIDC-AI/Ovis 在多模态大语言模型 (MLLM) 中&#xff0c;不同的嵌入策略有显著的区别。以下是使用基于连接器的方法与 Ovis 方法的比较&#xff1a; 基于连接器的方法-优缺点(connector-based …

WPF+MVVM案例实战(十)- 水波纹按钮实现与控件封装

文章目录 1、运行效果1、封装用户控件1、创建文件2、依赖属性实现 2、使用封装的按钮控件1.主界面引用2.按钮属性设置 3 总结 1、运行效果 1、封装用户控件 1、创建文件 打开 Wpf_Examples 项目&#xff0c;在 UserControlLib 用户控件库中创建按钮文件 WaterRipplesButton.x…

产品结构设计(五):结构设计原则

1. 产品结构设计总原则 1.1 合理选用材料 1、根据产品应用场所来选择 如果为日常消费类电子产品&#xff0c;产品材料就应选用强度好、表面容易处理、不容易氧化生锈、不容易磨伤、易成型的材料&#xff0c;如塑胶材料选用 PC、ABS、PCABS 等&#xff0c;金属材料选用不锈钢、…