C++ 学习之路---list容器
- 前言
- List简介
- 容器属性
- 成员函数
- 迭代器 :
- 容量
- 元素访问
- 修饰语
- 操作
- 观察员
- 重载的非成员函数
- 练习
- 结语
前言
不知不觉到了毕业季,面临着找工作的问题,之前通过C++ Primer Plus系统的学习过C++,但是学过之后很多知识不用就都淡忘了,现在通过做题发现有很多知识需要重新捡起来,对于C++容器中List的实现方式不太了解,特此写此博客。为了学习也为了与别人共勉。
List简介
在C++官网关于List的介绍中,提到:
- list容器位于std命名空间,使用需要加std::来声明命名空间使用;
- 需要增加#include 头文件
- list是底层数据结构是双向链表,相对于顺序存储(数组)而言,链表可以快速的删除和插入,但是在遍历上不占优势。例如如果想得到第5个元素的值,则只能通过已知的一个元素位置(头或尾)一个一个遍历得到。
- 与forward_list很相似,不同在于forward_list是单向链表。
容器属性
序列:元素按照严格的线性关系进行存储,每个元素按照其在序列中的位置进行访问。
双向链表:每一个节点都包含三个部分信息,上一个节点的指针、当前节点的值、下一个节点的指针;能对前驱节点进行O(1)时间复杂度的操作,对于查找,删除,插入操作时间复杂度O(n);
内存请求:通过内存分配对象自动的处理内存需求。
成员函数
名称 | 注释 |
constructor | 构造函数(公有) |
destructor | 析构函数(公有) |
operator= | 赋值操作(公有) |
迭代器 :
名称 | 注释 |
begin | 返回迭代器的开头 |
end | 返回迭代器的末尾 |
rbegin | 返回反转迭代器的开头( = end) |
rend | 返回反转迭代器的末尾( = begin) |
cbegin | 返回const迭代器的开头 |
cend | 返回const迭代器的末尾 |
crbegin | 返回const反转迭代器的开头 |
crend | 返回const反转迭代器的末尾 |
容量
名称 | 注释 |
empty | 若容器为空则返回false |
size | 返回容器元素的个数 |
max_size | 返回容器的最大容量 |
元素访问
名称 | 注释 |
front | 返回第一个元素 |
back | 返回最后一个元素 |
修饰语
名称 | 注释 |
assign | 将新内容分配给容器 |
emplace_front | 在开始时构造插入元素 |
push_front | 再开始插入元素 |
pop_front | 删除第一个元素 |
emplace_back | 在末尾构造并插入元素 |
push_back | 在末尾添加元素 |
pop_back | 删除末尾元素 |
emplace | 构造和插入元素 |
insert | 插入元素 |
erase | 擦除元素 |
swap | 交换内容 |
resize | 调整容器大小 |
clear | 清除容器内容 |
操作
名称 | 注释 |
splice | 将元素从一个表移到另一个表 |
remove | 删除特定元素 |
remove_if | 删除满足条件的元素 |
unique | 删除重复值 |
merge | 合并排序列表 |
sort | 对容器中的元素进行排序 |
reverse | 反转元素 |
观察员
get_allocator
重载的非成员函数
名称 | 注释 |
relational operators (list) | list的关系运算符 |
swap (list) | 交换两个list容器内容 |
练习
练习1:
/* 移动0的位置
给一组数据,写一个函数将数组中的0移到最后,并保持非零元素的先后位置
example
Input:[0, 1, 0, 3, 12];
Output:[1, 3, 12, 0, 0];
注释:
1.不能进行拷贝;
2.要求最少的操作
*/
#include <list>
#include <iostream>
using namespace std;
class Solution {
public:
void MoveZeros(list<int>& l1)
{
if (l1.empty())
return;
int size = l1.size();
l1.remove(0);
int size1 = l1.size();
for (int i = size1; i < size; i++)
l1.push_back(0);
}
};
练习2:
/*erase练习
删除指定指定值de元素(delete功能)
*/
void testErase(list<int>& l, int n) //delete all elements equal n
{
for (list<int>::iterator it = l.begin(); it != l.end();)
{
if (*it == n)
{
l.erase(it++);
}
else
{
it++;
}
}
}
结语
对list容器有一个初始的认识,对于每一个成员函数的实现还需要进一步的研究。后续会增加相应的成员函数的实现及使用。