1. list的使用
首先,在使用list之前,我们得先了解list到底是个什么东西,查看文档可以了解到,list的底层是一个带头双向循环链表。
按照顺序,我们首先来了解一下list的默认成员函数,这里我们不关注后面关于allocator的参数。
1. 构造函数
接下来通过一段代码来了解一下:
void Test_construct() { list<int> lt1; list<int> lt2(5, 2); list<int> lt3(lt2.begin(), lt2.end()); list<int> lt4(lt3); }
2.迭代器的使用和数据访问
我们知道,迭代器设计模式的出现就是为了让所有的容器都有统一的访问方式,所以这里迭代器的使用与之前讲的string和vector没有任何区别。
void Test_Iterator() { list<int> lt; lt.push_back(1); lt.push_back(2); lt.push_back(3); lt.push_back(4); lt.push_back(5); lt.push_back(6); //写 list<int>::iterator it = lt.begin(); while (it != lt.end()) { *it *= 10; ++it; } //读 it = lt.begin(); while (it != lt.end()) { cout << *it << " "; ++it; } cout << endl; }
但是对于string和vector,我们对其中数据访问的方式有三种:[]下标访问,迭代器,范围for。其中使用[]访问的目的是为了访问到任意元素的时间复杂度都为O(1),但是对于list的结构:链表,我们,没办法做到O(1)的访问,所以这里就没有重载[]的必要了所以对于list的访问方式只有迭代器和范围for两种。
3. 容量相关
1. size:拿到list的数据个数
由于list的结构,所以不会出现有容量的概念,因为每次插入数据或者删除数据的时候,直接插入或删除一个节点即可。所以这里只提供了size这个接口用于返回数据个数。
2. resize:改变数据个数
和其他STL容器的接口相同的用法
3. clear:清空容器中的所有数据
void Test_Capacity() { list<int> lt; lt.push_back(1); lt.push_back(2); lt.push_back(3); lt.push_back(4); lt.push_back(5); lt.push_back(6); cout << "size:" << lt.size() << endl; lt.resize(5); cout << "size:" << lt.size() << endl; lt.resize(10, 20); cout << "size:" << lt.size() << endl; auto begin = lt.begin(); while (begin != lt.end()) { cout << *begin << " "; ++begin; } cout << endl; lt.clear(); cout << "size:" << lt.size() << endl; }






