C++学习:list

1.list的定义和结构

list的使用频率不高,在做题时几乎遇不到需要使用list的情景。list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器。list容器以节点(node的形式存储元素,并使用指针将这些节点链接在一起,形成一个链表结构。list容器结构如下:

list容器模板接受两个参数:

1.T:指定容器中存储的元素类型。 list<int>

2.Allocator(可选):指定用于分配内存的分配器类型,默认为std::allocator<T>
一般不用填

list容器的特点包括:·双向性:每个节点都包含指向前一个节点和后一个节点的指针,因此可以在常数时间内在链表中的任意位置进行插入、删除和访问操作。动态大小:链表的大小可以根据需要动态扩展或收缩,不需要预先指定容器的大小。

不连续存储:链表中的节点可以在内存中的任意位置分布,不要求连续存储,因此插入和删除操作不会导致元素的移动 。如 1 22 33 35 63...

list容器提供了一系列成员函数和迭代器来操作和访问链表中的元素,包括插入删除、访问、反转等操作。可以使用迭代器来遍历链表中的元素。

c++ 复制代码
#include <iostream>
#include<list>
int main(){
	std::list<int> mylist;
// 在链表尾部插入元素
	myList.push_back(1);
	myList.push_back(2);
	myList.push_back(3);
// 在链表头部插入元素myList.push front(@);
//遍历链表并输出元素
	for(int num :myList)
	{std::cout<< num << " ";}
	std::cout << std::endl;
	return 0;
}

在上述示例中,我们首先创建了一个list容器myList,然后使用push_back()和push_front()函数分别在链表尾部和头部插入元素。最后,使用范围基于范围的for循环遍历链表并输出元素。需要注意的是,由于list是双向链表,因此插入和删除操作的时间复杂度是常量时间O(1),但访问和查找操作的时间复杂度是线性时间O(n),其中n是链表的大小。因此,如果需要频繁进行随机访问操作,可能更适合使用支持随机访问的容器,如vector或deque(双端队列)

list容器提供了多个常用的成员函数来操作和访问链表中的元素以下是一些常用的list函数的解释:

1.push_back():将元素插入到链表的末尾。

2.push front():将元素插入到链表的开头。

3.pop back():移除链表末尾的元素。

4.pop front():移除链表开头的元素。

5.size():返回链表中元素的个数。

6.empty():检查链表是否为空。

7.clear():清空链表中的所有元素。

8.front():返回链表中第一个元素的引用。

9.back():返回链表中最后一个元素的引用。

10.begin():返回指向链表第一个元素的迭代器。

11.end():返回指向链表末尾的下一个位置的迭代器。

12.insert():在指定位置之前插入一个或多个元素。

13.erase():从链表中移除指定位置的一个或多个元素。

c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(void) {
	//创建一个list<int>对象myList
	list<int>myList;
	//向myList尾部添加元素
	for (int i = 1; i <= 5; ++i)
		myList.push_back(i);


	//从头到尾输出myList中的元素
	for (const auto& i : myList)
		cout << i << ' ';
	cout << '\n';


	//将mylist中的元素反转
	reverse(myList.begin(), myList.end());


	for (const auto& i : myList)
		cout << i << ' ';
	cout << '\n';


	//在第一个元素的后一个位置加上元素0
	myList.insert(++myList.begin(), 0);

	for (const auto& i : myList)
		cout << i << ' ';
	cout << '\n';

	myList.erase(++++myList.begin(), --myList.end());
	//输出myList的大小
	cout << "链表大小为:" << myList.size() << '\n';

		//从头到尾输出myList中的元素
	for (const auto& i : myList)
		cout << i << ' ';
		cout << '\n';
	return 0;
}

迭代器相当于是一个指针

相关推荐
As977_2 分钟前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
ajsbxi5 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
Rattenking6 分钟前
React 源码学习01 ---- React.Children.map 的实现与应用
javascript·学习·react.js
&岁月不待人&20 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove24 分钟前
G1垃圾回收器日志详解
java·开发语言
dsywws28 分钟前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
道法自然040229 分钟前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器
无尽的大道31 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒35 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~39 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio