一,list的内存空间
vector使用的是连续的内存空间,list使用的是离散的内存空间。每当往list中插入一个元素,就会为这个元素分配一块内存空间,不同的元素的内存空间通过指针链接在一起。因此,list对内存空间的运用非常精准,一点也不浪费,而且对于任何位置的插入与删除操作,list永远是常数时间。
二,list的迭代器
list不能像vector那样以普通的指针作为迭代器,因为其内存空间不是连续的。由于list的底层是一个双向循环链表,迭代器必须具有前移、后移的能力,list的迭代器不支持随机访问操作。list还有一个重要的性质,插入与删除操作不会导致原迭代器失效。这在vector上是不成立的,因为vector的插入操作,可能导致内存的重新配置。
三,list的基本操作
1,初始化操作
int nums[] = {1, 2, 3};
//建一个含三个默认值是0的元素的链表
list<int> a1(3);
//使用数组初始化链表
list<int> a2(nums, nums + 3);
2,添加与获取元素
list<int> myList;
//在链表尾部插入元素
myList.push_back(1);
myList.push_back(2);
//获取头、尾结点的元素值
int x = myList.front();
int y = myList.back();
3,删除元素
list<int> myList;
myList.push_back(1);
myList.push_back(2);
//删除队尾的元素,并且不会返回这个元素,pop_back()返回值为void
mylis.pop_back();
//删除指定位置的元素
myList.erase(myList.begin());
4,其他常用操作
//判断容器是否为空,如果容器中没有元素返回true,否则返回false
myList.empty();
//获取容器中元素的数目
int size = myList.size();