【C++教程从0到1入门编程】第十一篇:STL中list类的初识

2024-03-15 00:44

本文主要是介绍【C++教程从0到1入门编程】第十一篇:STL中list类的初识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、 list的介绍及使用

list的介绍

        list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
       list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
        list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
       与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
       与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问。比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素) 。

1.list的使用
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
#include<assert.h>
using namespace std;void print_list(const list<int>& lt)//传引用,提高效率,减少拷贝,const迭代器只可以读
{list<int>::const_iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;
}void testlist2()
{list<int>lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);lt1.push_front(10);lt1.push_front(20);list<int>lt2(lt1);                   //拷贝构造   list<int>::iterator it = lt2.begin();while (it != lt2.end()){cout << *it << " ";it++;}cout << endl;print_list(lt2);list<int> lt3;lt3 = lt2;                         //赋值运算符重载print_list(lt3);for (auto e : lt3)                 //支持迭代器就支持范围for,范围for就是标准的begin,end演化而来{cout << e << " ";}cout << endl;list<int>::reverse_iterator rit = lt3.rbegin();while (rit != lt3.rend()){cout << *rit << " ";rit++;}cout << endl;}int main()
{testlist2();return 0;
}
2.list iterator的使用
void testlist1()
{//带头双向循环链表list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_front(10);l.push_front(20);l.pop_back();l.pop_front();list<int>::iterator it = l.begin();while (it != l.end()){*it += 1;cout << *it << " ";it++;}cout << endl;list<int>::reverse_iterator  vit = l.rbegin();while (vit != l.rend()){cout << *vit << " ";vit++;}cout << endl;//const list<int>l;list<int>::const_iterator cit = l.begin();while (cit != l.end()){//*cit += 1;cout << *cit << " ";cit++;}cout << endl;
}
void print_list(const list<int>& lt)//传引用,提高效率,减少拷贝,const迭代器只可以读
{list<int>::const_iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;
}
3.list capacity的使用

void testlist3()
{list<int>lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);lt1.push_front(10);lt1.push_front(20);cout << lt1.size() << endl;cout << lt1.empty() << endl;
}

4.list element access的使用
5.list modifiers的使用
void testlist4()
{list<int>lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_front(10);lt1.push_front(20);print_list(lt1);lt1.pop_back();lt1.pop_front();print_list(lt1);lt1.insert(lt1.begin(), 10);lt1.insert(lt1.end(), 20);print_list(lt1);list<int>::iterator pos = find(lt1.begin(), lt1.end(), 1);   //查找算法,双向迭代器list不支持下标访问if (pos != lt1.end()){lt1.insert(pos, 100);  //insert在pos位置的前面插入}print_list(lt1);lt1.erase(pos);print_list(lt1);lt1.erase(lt1.begin(), lt1.end());print_list(lt1);lt1.clear();print_list(lt1);}

void testlist5()
{list<int>lt1;lt1.push_back(20);lt1.push_back(10);lt1.push_back(30);lt1.push_front(40);print_list(lt1);lt1.sort();print_list(lt1);lt1.reverse();for (auto e : lt1){cout << e << " ";}cout << endl;
}

6.list modifiers的迭代器失效
      迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
void testlist6()
{list<int>lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_front(10);lt1.push_front(20);print_list(lt1);//list<int>::iterator it = lt1.begin();   //list不能erase,会造成迭代器失效问题//while (it != lt1.end())//{//	if (*it % 2 == 0)//	{//		lt1.erase(it);//	}//	it++;//}//print_list(lt1);list<int>::iterator it = lt1.begin();   //list不能erase,会造成迭代器失效问题,解决方法对迭代器重新赋值while (it != lt1.end()){if (*it % 2 == 0){it = lt1.erase(it);}else{it++;}}print_list(lt1);
}

这篇关于【C++教程从0到1入门编程】第十一篇:STL中list类的初识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810262

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题: