标准模板库(STL)之 list 用法【初级】
2020-07-29 本文已影响0人
Aliven888
背景
- 以下资料均属于在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。
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();
}