首页 > 编程语言 >【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 / 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )

【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 / 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )

时间:2024-01-02 12:06:14浏览次数:39  
标签:容器 迭代 元素 list 链表 lstInt 首尾



文章目录

  • 一、元素操作
  • 1、首尾 添加 / 删除 元素
  • 2、获取 首尾 元素
  • 二、迭代器遍历容器
  • 1、正向迭代与反向迭代
  • 2、代码示例








一、元素操作



1、首尾 添加 / 删除 元素



list 双向链表容器 提供了 push_back、pop_back、push_front 和 pop_front 等一系列用于操作列表元素的成员函数 , 函数原型如下 :

  • 头部插入元素 : 在容器的头部插入 val 引用指向的值 ;
void push_front (const value_type& val);

// 头部插入 666
lstInt.push_front(666);
  • 头部删除元素 : 函数删除列表的第一个元素 , 如果列表为空 , 则此操作未定义崩溃退出 ;
void pop_front ();

// 删除头部元素
lstInt.pop_front();
  • 尾部插入元素 : 在容器尾部插入一个元素 val ;
void push_back (const value_type& val);

// 尾部插入 888
lstInt.push_back(888);
  • 尾部删除元素 :
void pop_back ();

// 删除尾部元素
lstInt.pop_back();

上述函数都接受常量引用作为参数( 对于 push_back 和 push_front )或 没有参数(对于 pop_back 和 pop_front) , 并且没有返回值 ;

如果要删除元素 , 确保容器不为空 , 否则会出现 操作未定义 , 程序直接崩溃退出 ;



代码示例 :

#include "iostream"
using namespace std;
#include "list"

// 打印 list 容器内容
void printL(list<int>& lst) {
	// 获取迭代器起始位置
	list<int>::iterator it = lst.begin();

	cout << "list 容器内容 : ";

	// 循环判定, 如果没有迭代到最后一个元素的后一个位置, 那么一直循环
	while (it != lst.end())
	{
		// 获取元素值
		cout << *it << " ";
		// 迭代器指向下一个元素
		it++;
	}
	// 回车换行
	cout << endl;
}

int main() {

	// list 双向链表容器 使用初始化列表构造
	list<int> lstInt{1, 2, 3, 4, 5};

	// 打印 list 容器内容
	printL(lstInt);

	// 头部插入 666
	lstInt.push_front(666);

	// 尾部插入 888
	lstInt.push_back(888);

	// 打印 list 容器内容
	printL(lstInt);

	// 删除头部元素
	lstInt.pop_front();

	// 删除尾部元素
	lstInt.pop_back();

	// 打印 list 容器内容
	printL(lstInt);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

list 容器内容 : 1 2 3 4 5
list 容器内容 : 666 1 2 3 4 5 888
list 容器内容 : 1 2 3 4 5
请按任意键继续. . .

【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 / 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )_链表



2、获取 首尾 元素



std::list 是一个双向链表容器 提供了 back 和 front 这两个成员函数 , 用于访问链表的最后一个和第一个元素 , 函数原型如下 :

  • 访问首元素 : 该函数返回对链表第一个元素的引用 ; 如果链表为空 , 则此操作未定义 , 崩溃退出 ;
reference front();  
const_reference front() const;
  • 访问尾元素 : 该函数返回对链表最后一个元素的引用 ; 如果链表为空 , 则此操作未定义 , 崩溃退出 ;
reference back();  
const_reference back() const;



代码示例 :

// list 双向链表容器 使用初始化列表构造
	list<int> lstInt{1, 2, 3, 4, 5};

	cout << "首元素 : " << lstInt.front() << endl;
	cout << "尾元素 : " << lstInt.back()  << endl;



完整代码示例 :

#include "iostream"
using namespace std;
#include "list"

// 打印 list 容器内容
void printL(list<int>& lst) {
	// 获取迭代器起始位置
	list<int>::iterator it = lst.begin();

	cout << "list 容器内容 : ";

	// 循环判定, 如果没有迭代到最后一个元素的后一个位置, 那么一直循环
	while (it != lst.end())
	{
		// 获取元素值
		cout << *it << " ";
		// 迭代器指向下一个元素
		it++;
	}
	// 回车换行
	cout << endl;
}

int main() {

	// list 双向链表容器 使用初始化列表构造
	list<int> lstInt{1, 2, 3, 4, 5};

	// 打印完整列表
	printL(lstInt);

	cout << "首元素 : " << lstInt.front() << endl;
	cout << "尾元素 : " << lstInt.back()  << endl;


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

list 容器内容 : 1 2 3 4 5
首元素 : 1
尾元素 : 5
请按任意键继续. . .

【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 / 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )_list_02






二、迭代器遍历容器



1、正向迭代与反向迭代



std::list 双向链表容器 提供了 begin、end、rbegin 和 rend 这几个成员函数,用于 获取 迭代访问链表中的元素 的 迭代器 , 函数原型如下 :

  • 获取首元素迭代器 : 返回一个迭代器 , 指向链表的第一个元素 ;
iterator begin();  
const_iterator begin() const;
  • 获取尾元素之后的迭代器 : 返回一个迭代器 , 指向链表的尾部 , 该尾部指的是 超出链表末尾 的位置 , 不是最后一个元素 , 是最后一个元素后面的位置 , 无法获取值 ;
iterator end();  
const_iterator end() const;
  • 获取指向尾元素的反向迭代器 : 该函数返回一个反向迭代器 , 指向链表的最后一个元素 ; 如果链表为空 , 则此操作未定义 ; 反向迭代器从链表的尾部向头部移动 ;
  • 获取指向首元素之前的反向迭代器 : 返回一个反向迭代器 , 指向链表的 超出头部 ”的位置 , 即第一个元素的前一个位置 ; 该迭代器 它用于与 rbegin 一起实现完整的逆向迭代 ;
reverse_iterator rend();  
const_reverse_iterator rend() const;

迭代器的位置如下图所示 :

【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 / 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )_STL_03

  • 正向迭代示例 :
// 正向迭代
	for (list<int>::iterator it = lstInt.begin(); it != lstInt.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
  • 反向迭代示例 :
// 反向迭代
	for (list<int>::reverse_iterator rit = lstInt.rbegin(); rit != lstInt.rend(); rit++)
	{
		cout << *rit << " ";
	}
	cout << endl;



2、代码示例



代码示例 :

#include "iostream"
using namespace std;
#include "list"

// 打印 list 容器内容
void printL(list<int>& lst) {
	// 获取迭代器起始位置
	list<int>::iterator it = lst.begin();

	cout << "list 容器内容 : ";

	// 循环判定, 如果没有迭代到最后一个元素的后一个位置, 那么一直循环
	while (it != lst.end())
	{
		// 获取元素值
		cout << *it << " ";
		// 迭代器指向下一个元素
		it++;
	}
	// 回车换行
	cout << endl;
}

int main() {

	// list 双向链表容器 使用初始化列表构造
	list<int> lstInt{1, 2, 3, 4, 5};

	// 正向迭代
	for (list<int>::iterator it = lstInt.begin(); it != lstInt.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

	// 反向迭代
	for (list<int>::reverse_iterator rit = lstInt.rbegin(); rit != lstInt.rend(); rit++)
	{
		cout << *rit << " ";
	}
	cout << endl;


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

1 2 3 4 5
5 4 3 2 1
请按任意键继续. . .

【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 / 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )_链表_04


标签:容器,迭代,元素,list,链表,lstInt,首尾
From: https://blog.51cto.com/u_14202100/9066901

相关文章

  • 【C++】STL 容器 - list 双向链表容器 ① ( 容器特点 | 容器操作时间复杂度 | 构造函
    文章目录一、list双向链表容器简介1、容器特点2、容器操作时间复杂度3、遍历访问5、头文件二、list双向链表容器构造函数1、默认无参构造函数2、创建包含n个相同元素的list双向链表3、使用初始化列表构造list双向链表4、使用另外一个list容器构造list双向链表容器......
  • 【C++】STL 容器 - list 双向链表容器 ③ ( list 常用 api 简介 | 中间位置 插入 / 删
    文章目录一、list双向链表容器的中间位置插入元素1、在指定位置插入1个元素-insert函数2、在指定位置插入n个相同元素-insert函数3、中间位置插入另一个容器的指定范围内的元素-insert函数二、list双向链表容器的中间位置删除元素1、删除容器中所有元素......
  • 【JDK源码】Java中LinkedList的实现
    JDK版本:1.8.0_271基础介绍LinkedList底层数据结构是一个双向链表:链表的每个节点叫做Node,在Node中,prev属性表示前一个节点的位置,next属性表示后一个节点的位置first是双向链表的头节点,它的前一个节点是nulllast是双向链表的尾节点,它的后一个节点是null当链表中没有数据时,fi......
  • 【JDK源码】ArrayList的代码实现
    JDK版本:1.8.0_271基础介绍ArrayList底层数据结构就是一个数组:index表示数组下标,从0开始计数,elementDatda表示数组本身DEFAULT_CAPACITY表示数组的初始化大小,默认是10size表示数组的大小,int类型,没有使用volatile修饰,非线程安全modCount统计当前数组被修改的版本次数,数......
  • DNS查询的两种方式:递归查询和迭代查询
    1、递归解析 当局部DNS服务器自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询。此时有两种方式,如图所示的是递归方式。局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给......
  • list容器
    #include<iostream>#include<list>//引入头文件#include<algorithm>usingnamespacestd;intmain(){ list<int>a; intb[]={1,2,3,4}; list<int>c(b,b+sizeof(b)/sizeof(int)); a.insert(a.begin(),c.begin(),c.end()); a.insert(a.beg......
  • list容器介绍代码
    #include<iostream>#include<list>#include<algorithm>usingnamespacestd;intmain(){ list<int>a; intb[]={1,2,3,4}; list<int>c(b,b+sizeof(b)/sizeof(int)); a.insert(a.begin(),3,1); //队头添加元素 a.push_front(0); //队尾添加元素......
  • list容器
    #include<iostream>#include<list>//引入list容器的头文件#include<algorithm>usingnamespacestd;intmain(){ list<int>a; intb[]={1,2,3,4}; list<int>c(b,b+sizeof(b)/sizeof(int)); a.insert(a.begin(),c.begin(),c.end()); a.in......
  • java8中object转list
    Java8中Object转List的实现概述在Java8中,我们可以使用StreamAPI将一个Object对象转换为List集合。本文将介绍如何使用StreamAPI实现此功能,并提供相应的示例代码。实现步骤下面是实现"Java8中Object转List"的步骤,我们可以使用以下表格形式展示:步骤描述1创建一个Obj......
  • Filter过滤和Listener监听器
    过滤器Filter简介Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet,静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能处理编码。它主要用......