标准模板库(STL)之 list 用法【初级】

背景

  • 以下资料均属于在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。

1、简介

  • lsit —— 双向循环列表双链表既可以向前又向后链接他的元素。每一个元素都知道前面一个元素和后面一个元素。

2、特点

  • 在标准模板库(STL)中, list 和 vector 一样,是两个最常用的容器。
  • 但是,和 vector 不同的是,list不支持对元素的任意存取。在 list 中对元素的存在是通过对齐首元素的操作来实现的,常用函数push_front 和 pop_front,这是和 vector 所不具备的。
  • 和 vector 另外一点不同的是,list 的迭代器不会存在失效的情况,他不像 vector 会保留备份空间,在超出容量额度时会重新分配一个内存,导致迭代器失效。而 list 没有备份空间的概念,出、入一个元素就申请一个元素的空间,所以它的迭代器不会失效。
  • list 将元素按顺序储存在链表中. 与向量 (vector) 相比, 它允许快速的插入和删除,但是随机访问却比较慢。

3、常用接口函数

*  常用接口:
*   assign() 给list赋值
*	back() 返回最后一个元素
*	begin() 返回指向第一个元素的迭代器
*	clear() 删除所有元素
*	empty() 如果list是空的则返回true
*	end() 返回末尾的迭代器
*	erase() 删除一个元素
*	front() 返回第一个元素
*	get_allocator() 返回list的配置器
*	insert() 插入一个元素到list中
*	max_size() 返回list能容纳的最大元素数量
*	merge() 合并两个list
*	pop_back() 删除最后一个元素
*	pop_front() 删除第一个元素
*	push_back() 在list的末尾添加一个元素
*	push_front() 在list的头部添加一个元素
*	rbegin() 返回指向第一个元素的逆向迭代器
*	remove() 从list删除元素
*	remove_if() 按指定条件删除元素
*	rend() 指向list末尾的逆向迭代器
*	resize() 改变list的大小
*	reverse() 把list的元素倒转
*	size() 返回list中的元素个数
*	sort() 给list排序
*	splice() 合并两个list
*	swap() 交换两个list
*	unique() 删除list中重复的元素

4、接口使用详解

4.1、定义一个list变量

list<int> m_iList;

4.2、list 删除操作

//clear()
m_iList.clear();   //清空list缓存,全部清空

//remove()
//0,1,2,3,3,2 清理后 0,1,2,2 
//清除了所有值为 3 的元素,可见这里是以元素对象进行的清除
m_iList.remove(3);

4.3、判断 list 是否为空

//在从m_iList中取值时,需要判断一下m_iList是否为空,
//在不为空的情况下再去操作m_iList,以免内存空间使用异常。
if (!m_iList.empty())  //判断是否为空,为空返回true
{...}

4.4、向 list 中添加一个元素

/*****************************************************
* 功 能 : 添加元素
*
* 参  数: OUT int& element : 添加的元素
*          IN bool bFront : 是否从前面添加元素,默认 true
* 返回值:void
*
* 说 明:push_front(...) : 从前面添加
*        push_back(...)  : 从后面添加
* 
* 作 者:Aliven888
*****************************************************/
void CSTLListClass::pushElement(IN int element, IN bool bFront)
{
	if (!bFront)
	{
		m_iList.push_back(element);  //从后面添加
	}
	else
	{
		m_iList.push_front(element);  //从前面添加
	}
}

4.5、获取 list 中头/尾的元素

/*****************************************************
* 功 能 : 获取元素
*
* 参  数: OUT int& element : 取出的元素
*          IN bool bFront : 是否从前面获取元素,默认 true
*
* 返回值:void 
*
* 说 明:front() : 获取头部第一个元素的值
*        pop_front() :删除头部第一个元素
*        back() : 获取尾部第一个元素的值
*        pop_back() :删除尾部第一个元素
*
* 作 者:Aliven888
*****************************************************/
void CSTLListClass::popElement(OUT int& element, IN bool bFront)
{
	if (!m_iList.empty())
	{
		if (!bFront)
		{
			element = m_iList.back();  //获取尾部第一个元素的值
			m_iList.pop_back(); //删除尾部第一个元素
		}
		else
		{
			element = m_iList.front(); //获取头部第一个元素的值
			m_iList.pop_front(); //删除头部第一个元素
		}
	}
}

4.6、遍历 list 的元素

/*****************************************************
* 功 能 : 遍历元素
*
* 参  数: 无
*
* 返回值:void
*
* 说 明:
*
* 作 者:Aliven888
*****************************************************/
void CSTLListClass::traverseElement()
{
	//定义迭代器
	list<int>::iterator beginIter = m_iList.begin();
	list<int>::iterator endIter = m_iList.end();

	//循环遍历
	for (; beginIter != endIter; ++beginIter)
	{
		cout << *beginIter << endl;  //Windows C++打印
		qDebug("m_iList current value is [%d]", *beginIter); //Qt C++ 打印
	}
}

4.7、list 元素去重

/*****************************************************
* 功 能 : 去除重复元素
*
* 参  数:无
*
* 返回值:void
*
* 说 明:这里清除重复指的是并列重复,每次都是和前一个元素相较,
*       (并不是和前面的全部元素相比较),发现重复了就清除掉。
*		 比如: 0 1 2 3 3 2 处理后就是 0 1 2 3 2
*	
* 作 者:Aliven888
*****************************************************/
void CSTLListClass::uniqueElement()
{
	m_iList.unique();
}

4.8、list 排序

/*****************************************************
* 功 能 : 给list排序
*
* 参  数:
*
* 返回值:void
*
* 说 明: front ---> back
*         2,3,3,2,1,0 排序后 0,1,2,3,3,2
*         通过上面的举例我们可以看出,sort() 排序后,小值在 front 一端
*
* 作 者:Aliven888
*****************************************************/
void CSTLListClass::sortElement()
{
	m_iList.sort();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值