STL标准库-容器-list
Posted 勿在浮沙筑高台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL标准库-容器-list相关的知识,希望对你有一定的参考价值。
技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性。
list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历.在list 的任意位置插入和删除元素的效率都很高.
它的结构
一 定义
头文件 #include <vector>
#include <iostream> #include <list> using namespace std; int main(int argc, const char * argv[]) { //a.定义 list<typeName> name; list<int> l; //b.拷贝构造 list<int> l1(l); //c.拷贝赋值 l1 = l; //d.按指定元素个数定义 含五个默认值是0的元素的链表 list<int> l2(5); //e.指定元素个数及类型 含有5个值为2的链表 list<int> l3(5,2); //f.指定赋值区域 list<int> l4(l1.begin(),l1.end()); return 0; }
二 基本使用
int main_1() { list<int> l; //返回指向第一个元素的迭代器 l.begin(); //返回指向最后一个元素的下一个位置的迭代器 l.end(); int num = 1; //在末尾增加一个元素。 l.push_back(num); //删除末尾的元素。 l.pop_back(); //在起始端增加元素 l.push_front(num); //删除第一个元素。 l.pop_front(); //返回第一个元素 l.front(); //返回最后一个元素 l.back(); //判断是否为空 l.empty(); //返回元素个数 l.size(); //返回list最大容量 l.max_size(); //清空list l.clear(); //在指定位置插入元素 l.insert(l.begin(),num); //在指定位置插入5个元素 l.insert(l.begin(),5,num); //在指定位置插入区间 l.insert(l.begin(),l.begin(),l.end()); //返回逆向链表的第一个元素,即l链表的最后一个数据。 l.rbegin(); //返回逆向链表的最后一个元素的下一个位置,即l链表的第一个数据再往前的位置。 l.rend(); //将5个num拷贝赋值给链表 l.assign(5,num); //将指定区间的元素拷贝赋值给链表 l.assign(l.begin(),l.end()); //删除指定下标位置的元素。 l.erase(l.begin()); //从新定义链表的长度,超出原始长度部分用0代替,小于原始部分删除。 l.resize(10); //从新定义链表的长度,超出原始长度部分用num代替。 l.resize(10,num) ; list<int> l1; //将l1和l交换。 l1.swap(l); //将l1和l交换。 swap(l1,l); //删除相同元素 l.unique(); //删除链表中匹配num的元素 l.remove(num); //反转链表 l.reverse(); //将链表排序,默认升序 l.sort(); //自定义回调函数实现自定义排序 auto func_sort =[] { std::cout<< "自定义排序方式" <<std::endl; }; l.sort(func_sort); auto func_remove_if = [](int n){ return n<3; }; //删除条件满足的元素,参数为自定义的回调函数 l.remove_if(func_remove_if); //合并2个有序的链表并使之有序,从新放到l里,释放l1 l.merge(l1); //合并2个有序的链表并使之按照自定义规则排序之后从新放到l中,释放l1 l.merge(l1,func_sort); //将l1连接在l的beg位置,释放l1 l.splice(l.begin(),l1); //将l1的beg位置的元素连接到l的beg位置,并且在l1中施放掉beg位置的元素 l.splice(l.begin(),l1,l1.begin()); //将l1的[beg,end)位置的元素连接到l的beg位置并且释放l1的[beg,end)位置的元素 l.splice(l.begin(),l1,l1.begin(),l1.end()); return 0; }
三 list支持的算法
从上文你可以看出来, 我没有引用算法头文件,但是依然能使用算法. 如
l.sort();
是因为容器与算法之间的联系是通过迭代器,而标准库中的算法的实现方式很多都是循序查找,即随机查找.随机查找的操作是需要在迭代器上,然而list容器的内存不连续,所以list的迭代器所指向的内存也不连续.所以标准库自带的排序算法不适用.
list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历。在list 的任意位置插入和删除元素的效率都很高。
指针必须被重新赋值,但是,不需要用拷贝元素来实现移动。另一方面,它对随机访问的支持并不好。访问一个元素需要遍历中间的元素,另外每个元素还有两个指针的额外空间开销。
以上是关于STL标准库-容器-list的主要内容,如果未能解决你的问题,请参考以下文章
STL标准库 & 范型编程学习笔记:vectorarrayforward_list深度探索