【C++初阶】STL——List从入门到应用完全指南(1)

🎈主页传送门:良木生香

🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》《鼠鼠的C++学习之路》 《Linux系统编程》

🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离



前言:在此之前,我们已经学习了STL中的vector和string类的用法,是我们对于STL库有了一个基本的认识,那么今天我们就继续往下学习另外一个STL库中常用的容器:List。


目录

一、list介绍

二、list接口介绍与基本使用方法

[2.1、list 构造/析构函数:](#2.1、list 构造/析构函数:)

[2.2、list Iterator(迭代器)](#2.2、list Iterator(迭代器))

[2.3、list capacity](#2.3、list capacity)

[2.4、list Elememt access](#2.4、list Elememt access)

[2.5、list Modifiers](#2.5、list Modifiers)

三、测试代码


一、list介绍

list文档相关链接:list - C++ Reference

list在官方的定义中是:**带头节点双向循环链表,**图解如下:


二、list接口介绍与基本使用方法

在list这个类中,官方提供的接口比较多,用起来可能会比较复杂,但是也和之前的vector和string类有相似之处,所以本文将会以下面都板块的顺序对list进行讲解:

2.1、list 构造/析构函数:

list构造函数链接:list构造函数

总结如下(以int类型为例):

|-------------------------------------------------------------------|---------------------------------|
| list() | 默认构造一个空的list链表 |
| list (size_type n, const value_type& val = value_type()) | 用n个值为val的元素构造list链表 |
| list (const list& x) | 用x链表对list链表进行拷贝构造 |
| list (InputIterator first, InputIterator last) | 用[ first,last)区间的元素对list链表进行构造 |

具体实现代码如下:

运行结果为:

析构函数的话,一般不用自己实现,库里面已经帮你搞定了:

析构函数:list析构函数


2.2、list Iterator(迭代器)

list的迭代器大家可以将他理解为像指针一样的东西,指向的就是链表中的某个节点,具体的详细说法可以参考这篇文章:

【数据结构-初阶】详解线性表(3)---双链表-CSDN博客

这里或许能更好的帮助大家理解双链表。

文档中的指针大概总结如下:

**begin() /**end()

**rbegin() /**rend()

如果在各自的前面再加上c,那就代表着对象是const对象。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|
| begin()+end() | 返回第一个元素的迭代器 + 返回最后一个元素下一个位置的迭代器 |
| rbegin()+rend() | 返回第一个元素的 reverse_iterator, end 位置返回最后一个元素下一个位 置的 reverse_iterator, begin 位置 |

图解如下:

【注意】
1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

使用示例:

运行结果为:

2.3、list capacity

capacity中的接口就比较少了:

一个是判空,一个是返回链表大小,一个是返回链表的最大节点数量

使用示例如下:

运行结果为:


2.4、list Elememt access

使用实例:

运行结果为:


2.5、list Modifiers

使用实例:

运行结果如下:


在list链接中还有一些其他的操作,平时使用的频率不是很大,所以大家可以自行查阅,这里就不过多展示了~~~


三、测试代码

本篇文章的所有代码在这里汇总了:

cpp 复制代码
#include<iostream>
#include<list>
#include<string>
using namespace std;


template<class T>
void printf_list(const list<T>& list) {
	for (auto e : list) {
		cout << e << " ";
	}
	cout << endl;
}

void test_list() {
	list<int> list_total({ 10,20,30,40,50,60,70,80 });
	list<int>::iterator it_total = list_total.begin();
	it_total++;
	it_total++;//指向30
	list<int> list1;	//默认构造---空的list
	list<int> list2(5, 10);	//用5个10来初始化list2
	list<int> list3(list2);	//将list2拷贝以初始化list3
	list<int> list4(it_total, list_total.end());

	cout<<"初始化列表构造:"; 
	printf_list(list_total);
	cout << "默认构造:"; 
	printf_list(list1);
	cout << "用n个val值进行构造:"; 
	printf_list(list2);
	cout << "拷贝构造:"; 
	printf_list(list3);
	cout << "迭代器区间构造:"; 
	printf_list(list4);
}

void test_list2(){
	string s = "hello world";
	list<int> list1 = { 10,20,30,40,50,60,70 };
	list<int>::iterator it_begin = list1.begin();
	list<int>::iterator it_end = list1.end();
	list<int>::reverse_iterator it_rbegin = list1.rbegin();
	list<int>::reverse_iterator it_rend = list1.rend();
	for (list<int>::iterator it = it_begin; it != it_end; it++) {
		cout << *it << " ";
	}
	cout << endl;
	for (list<int>::reverse_iterator it = it_rbegin; it != it_rend; it++) {
		cout << *it << " ";
	}
	cout << endl;
}


void test_list3() {
	list<int> list1 = { 10,20,30,40,50,60,70,80,90,100 };
	cout << list1.size() << endl;
	if (list1.empty()) {
		cout << "链表为空" << endl;
	}
	else {
		cout << "链表不为空" << endl;
	}
	cout << list1.max_size() << endl;
}

void test_list4() {
	list<int> list1({ 10,20,30,40,50,60 });
	cout << list1.front() << endl;
	cout << list1.back() << endl;
}

void test_list5() {
	list<int> list1({ 10,20,30 });
	cout << "original_list:";
	printf_list(list1);
	cout << endl;

	list1.push_front(999);	
	list1.push_front(666);
	cout << "push_front():";
	printf_list(list1);
	cout << endl;

	list1.pop_front();
	cout << "pop_front():";
	printf_list(list1);
	cout << endl;

	list1.push_back(520);
	list1.push_back(999);
	cout << "push_back():";
	printf_list(list1);
	cout << endl;

	list1.pop_back();
	cout << "pop_back():";
	printf_list(list1);
	cout << endl;

	list<int>::iterator it = list1.begin();
	it++;
	list1.insert(it, 555);
	cout << "insert:";
	printf_list(list1);
	cout << endl;

	it++; it++;
	list1.erase(it);
	cout << "erase:";
	printf_list(list1);
	cout << endl;

	list<int> list2 = { 111,222,333,444,555,666 };
	cout << "before_Swap:" << endl;
	printf_list(list1);
	printf_list(list2);
	cout << endl;
	cout << "after_Swap:" << endl;
	list1.swap(list2);
	printf_list(list1);
	printf_list(list2);
	cout << endl;

	list1.clear();
	cout << "clear():";
	printf_list(list1);

}
int main() {
	
	//test_list();
	//test_list2();
	//test_list3();
	//test_list4();
	test_list5();
	return 0;
}

以上就是我对list基本接口的分享了,感谢大佬们的阅读~~~

文章是自己写的哈,有啥描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读。

相关推荐
Alice-YUE1 小时前
【无标题】
开发语言·javascript·ecmascript
WL_Aurora1 小时前
【每日一题】贪心
python·算法
aqiu1111111 小时前
【并查集专题top】
c++·算法
会周易的程序员1 小时前
aiDgeScanner 工业设备网络扫描与管理工具
网络·c++·物联网·架构·electron·node.js·iot
叼烟扛炮2 小时前
C++ 知识点17 友元
开发语言·c++·算法·友员
计算机安禾2 小时前
【c++面向对象编程】第2篇:类与对象(一):定义第一个类——成员变量与成员函数
开发语言·c++
Dxy12393102162 小时前
Python Pillow库:`img.format`与`img.mode`的区别详解
开发语言·python·pillow
亿牛云爬虫专家2 小时前
深度解析:数据采集场景下的 Java 代理技术实战
java·开发语言·数据采集·动态ip·动态代理·代理配置·连接池复用