首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++STL :list类 (一) 】C++98 完全指南:std::list 详解与源码剖析

【C++STL :list类 (一) 】C++98 完全指南:std::list 详解与源码剖析

作者头像
艾莉丝努力练剑
发布2025-11-13 11:18:02
发布2025-11-13 11:18:02
160
举报
文章被收录于专栏:C / C++C / C++

🔥艾莉丝努力练剑:个人主页

专栏传送门:《C语言》《数据结构与算法》C/C++干货分享&学习过程记录Linux操作系统编程详解笔试/面试常见算法:从基础到进阶

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬艾莉丝的简介:


🎬艾莉丝的C++专栏简介:



C++的两个参考文档

老朋友(非官方文档):cplusplus 官方文档(同步更新):cppreference

list容器文档链接:list



1 ~> 初识List:特性与能力介绍

list容器文档链接:list


2 ~> list 的核心接口与基本操作

list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已 达到可扩展的能力。以下为list中一些常见的重要接口——

2.1 list:构造函数

链接:constructor

构造函数(constructor)

接口说明

详细说明

list()

构造空的list

创建一个不包含任何元素的空list,使用默认构造的分配器

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

构造包含n个值为val元素的list

创建包含n个元素的list,每个元素都是val的副本。如果val省略,则使用value_type的默认构造函数

list(const list& x)

拷贝构造函数

创建x的副本,包含x中所有元素的拷贝,使用x的分配器

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

用[first, last)区间中的元素构造list

构造包含区间[first, last)中元素副本的list。InputIterator可以是任何输入迭代器类型,区间包含first但不包含last

2.2 list:iterator的使用

这里大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点

2.2.1 list iterator使用的表格总结

链接:

begin end rbegin rend

函数声明

接口说明

详细说明

iterator begin(); const_iterator begin() const;

返回指向list中第一个元素的迭代器

如果list为空,返回的迭代器等于end()。const版本用于const对象,返回的迭代器不允许修改元素值

iterator end(); const_iterator end() const;

返回指向list中最后一个元素下一个位置的迭代器

这是"尾后迭代器",不指向任何实际元素,常用于作为循环结束条件。对end()解引用是未定义行为

reverse_iterator rbegin(); const_reverse_iterator rbegin() const;

返回指向list中最后一个元素的反向迭代器

反向迭代器从尾部向头部移动。rbegin()指向最后一个元素,++rbegin()向前移动一个元素

reverse_iterator rend(); const_reverse_iterator rend() const;

返回指向list中第一个元素前一个位置的反向迭代器

反向迭代器的结束位置,不指向任何实际元素。rend()在begin()之前的位置

2.2.2 注意事项

1、begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动; 2、rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动。

2.3 list:capacity

链接:

empty size

函数声明

接口说明

详细说明

bool empty() const;

检测list是否为空

如果list中不包含任何元素(size为0)则返回true,否则返回false。此操作通常很快,时间复杂度为O(1)

size_type size() const;

返回list中元素的数量

返回list当前包含的元素个数。在C++98中,此操作的时间复杂度为O(1),因为标准要求size()必须在常数时间内完成

2.4 list:element access

链接:

front back

函数声明

接口说明

详细说明

reference front(); const_reference front() const;

返回list的第一个元素的引用

提供对list中第一个元素的直接访问。如果list为空,调用此函数是未定义行为。非const版本允许修改元素值,const版本用于只读访问

reference back(); const_reference back() const;

返回list的最后一个元素的引用

提供对list中最后一个元素的直接访问。如果list为空,调用此函数是未定义行为。非const版本允许修改元素值,const版本用于只读访问

2.5 list:modifiers

链接:

push_front pop_front push_back pop_back insert erase swap clear

函数声明

接口说明

详细说明

void push_front(const T& val);

在list首元素前插入值为val的元素

将新元素插入到list的开头位置,该元素成为新的第一个元素。插入操作是常数时间复杂度O(1)

void pop_front();

删除list中第一个元素

移除list的第一个元素。如果list为空,调用此函数是未定义行为。被删除元素的析构函数会被调用

void push_back(const T& val);

在list尾部插入值为val的元素

将新元素插入到list的末尾位置,该元素成为新的最后一个元素。插入操作是常数时间复杂度O(1)

void pop_back();

删除list中最后一个元素

移除list的最后一个元素。如果list为空,调用此函数是未定义行为。被删除元素的析构函数会被调用

iterator insert(iterator position, const T& val);

在指定位置插入元素

在position指定的位置之前插入值为val的元素,返回指向新插入元素的迭代器。插入操作是常数时间复杂度O(1)

iterator erase(iterator position);

删除指定位置的元素

删除position位置的元素,返回指向被删除元素之后元素的迭代器。如果删除的是最后一个元素,则返回end()

void swap(list& x);

交换两个list的内容

交换当前list与x的内容。此操作不会移动或拷贝元素,只是交换内部指针,因此是常数时间复杂度O(1)

void clear();

清空list中的所有元素

移除list中的所有元素,使size()变为0。所有元素的析构函数会被调用

list中还有一些操作,需要用到时大家可参阅list的文档说明。


本文代码完整展示

Test.c:

代码语言:javascript
复制
// list部分内容

#include<list>
#include<algorithm>

int main()
{
	list<int> lt1;
	list<int> lt2 = { 1,2,3,4,5 };
	list<int>::iterator it2 = lt2.begin();
	while (it2 != lt2.end())
	{
		cout << *it2 << " ";
		++it2;
	}
	cout << endl;

	for (auto e : lt2)
	{
		cout << e << " ";
	}
	cout << endl;

	auto pos = find(lt2.begin(), lt2.end(), 3);
	if (pos != lt2.end())
	{
		lt2.insert(pos, 30);// pos没有失效,因为
		lt2.erase(pos);     // pos失效了
		//cout << *pos << endl;
	}

	for (auto e : lt2)
	{
		cout << e << " ";
	}
	cout << endl;

	jqj::vector<int> v3 = { 10,20,30,40 };

	//sort(lt2.begin(), lt2.end());// 不支持
	lt2.sort();
	sort(v3.begin(), v3.end());

	list<int> lt3 = { 1,2,2,3,3,2,3,4,5 };
	for (auto e : lt3)
	{
		cout << e << " ";
	}
	cout << endl;
	lt3.sort();
	lt3.unique(); // 去重
	for (auto e : lt3)
	{
		cout << e << " ";
	}
	cout << endl;

	// 4这个节点挪到头位置
	list<int> lt4 = { 1,2,3,4,5 };
	for (auto e : lt4)
	{
		cout << e << " ";
	}
	cout << endl;
	pos = find(lt4.begin(), lt4.end(), 4);
	lt4.splice(lt4.begin(), lt4.end(), pos);
	for (auto e : lt4)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

结尾

往期回顾:

【C++STL :vector类 (二) 】C++ Vector迭代器失效避坑指南:原因与解决方案详解

结语:都看到这里啦!那请大佬不要忘记给博主来个“一键四连”哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++的两个参考文档
  • 1 ~> 初识List:特性与能力介绍
  • 2 ~> list 的核心接口与基本操作
    • 2.1 list:构造函数
    • 2.2 list:iterator的使用
      • 2.2.1 list iterator使用的表格总结
      • 2.2.2 注意事项
    • 2.3 list:capacity
    • 2.4 list:element access
    • 2.5 list:modifiers
  • 本文代码完整展示
    • Test.c:
  • 结尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档