一、List 容器简介
list是C++标准模版库(STL,Standard Template Library)中的部分内容。
list容器实质是一个双向链表,可以高效地进行插入删除元素。list不提供随机访问功能,也就是不能用下标和at()访问,当删除其中一个元素,指向其他元素的迭代器依然有效。对于任何位置的元素插入或移除,list永远是常数时间
List结构
list使用双向链表来管理元素,可以从两端发展新元素,其内部结构如下所示。
List能力
List的内部结构和vetor或deque截然不同,主要的区别入下:
- list不支持随机存取功能,可以支持首尾的直接存取,想获取其他元素,则需要遍历链表。
- 任何位置的删除、插入操作都非常快速,不需要移动和删除其他元素,这些操作在常数时间内完成。
- 安插和删除操作不会造成指向其他元素的各个pointer、reference、iterators失效
- list对异常操作的处理方式:要么成功,要么什么都不发生。
List所提供的成员函数区别:
list提供了不少特殊的成员函数,专门用于移动元素,和STL的通用算比较,这些成员函数的执行速度更快,主要是成员函数操作时,不需要移动元素或拷贝,仅需要调指针。
二、List 函数列表
函数 | 功能 |
list<T> lstT | list采用采用模板类实现,对象的默认构造形式 |
list(beg,end) | 构造函数将[beg, end)区间中的元素拷贝给本身 |
list(n,elem) | 构造函数将n个elem拷贝给本身 |
list(const list &lst) | 拷贝构造函数 |
函数 | 功能 |
c.push_back(elem) | 在容器尾部加入一个元素 |
c.pop_back() | 删除容器中最后一个元素 |
c.push_front(elem) | 在容器开头插入一个元素 |
c.pop_front() | 从容器开头移除第一个元素 |
c.insert(pos,elem) | 在pos位置插elem元素的拷贝,返回新数据的位置 |
c.insert(pos,n,elem) | 在pos位置插入n个elem数据,无返回值 |
c.insert(pos,beg,end) | 在pos位置插入[beg,end)区间的数据,无返回值 |
c.clear() | 移除容器的所有数据 |
c.erase(beg,end) | 删除[beg,end)区间的数据,返回下一个数据的位置 |
c.erase(pos) | 删除pos位置的数据,返回下一个数据的位置 |
c.remove(elem) | 删除容器中所有与elem值匹配的元素 |
函数 | 功能 |
c.size() | 返回容器中元素的个数 |
c.empty() | 判断容器是否为空 |
resize(num) | 重新指定容器的长度为num,变长则用默认值填充新位置;变短删除超出元素 |
resize(num, elem) | 重新指定容器的长度为num,变长则用elem填充新位置;变短删除超出元素 |
c1 == c2 | 判断c1 是否等于c2 |
c1 != c2 | 判断c1是否不等于c2 |
c1 < c2 | 判断c1 是否小于c2 |
c1 > c2 | 判断c1 是否大于c2 |
c1 <= c2 | 判断c1是否小于等于c2 |
c1 >= c2 | 判断c1是否大于等于c2 |
函数 | 功能 |
c1 = c2 | 将c2的全部元素赋值给c1 |
c.assign(n, elem) | 复制n个elem,复制给c |
c.assign(beg, end) | 将区间[beg;end)内的元素赋值给c |
c1.swap(c2) | 将c1和c2元素互换 |
swap(c1,c2) | 同上,此为全局函数 |
函数 | 功能 |
reverse() | 反转链表:1,2,3,反转后为3,2,1 |
sort() | sort为list的成员函数,而不是STL算法 |
c.sort(op) | 以op()为准则,对所有元素排序 |
c.unique() | 如果存在若干相邻而数值相等的元素,就移除重复元素,只留下一个 |
c.unique(op) | 如果存在若干相邻元素,都使op()的结果为ture,则移除重复元素,只留下一个。 |
c1.splice(pos, c2) | 将c2内的所有元素转移到c1之内,迭代器pos之前 |
c1.splice(pos, c2, c2pos) | 将c2内的c2pos所指元素转移到c1之内的pos所指位置上(c1,c2可相同) |
c1.splice(pos, c2, c2beg,c2end) | 将c2内的[c2beg,c2end)区间内所有元素转移到c1内的pos之前(c1,c2可相同) |
c1.merge(c2) | 假设c1和c2容器都包含已序(相同的排序方式)元素,将c2的全部元素转移到c1,并保证合并后的list还是已序。 |
c1.merge(c2,op) | 假设c1和c2容器都包含op()原则下的已序(相同的排序方式)元素,将c2的全部元素转移到c |