STL list
1、 基本概念
-
STL中的链表是一个双向循环链表
-
列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和删除操作,并在两个方向上进行迭代。
-
列表容器被实现为双向链接列表。双 链列表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过与到它前面的元素的链接和到它后面的元素的链接的每个元素的关联,在内部保持排序。
list的优点:
- 采用动态存储分配,不会造成内存浪费和溢出
- 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list的缺点:
- 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大
List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
总结:STL中List和vector是两个最常被使用的容器,各有优缺点
2、构造函数
list<T> lst;
//list采用采用模板类实现,对象的默认构造形式:list(beg,end);
//构造函数将[beg, end)区间中的元素拷贝给本身。list(n,elem);
//构造函数将n个elem拷贝给本身。list(const list &lst);
//拷贝构造函数。
测试
void test_1()
{
list<int> l;
l.push_back(1);
l.push_front(2);
l.push_back(5);
l.push_front(3);
list<int> l1(5,1);
list<int> l2(l.begin(),l.end());
list<int> l3(l);
printList(l);
printList(l1);
printList(l2);
printList(l3);
}
3、常用方法
swap(list)
将lst与本身的元素互换size();
//返回容器中元素的个数empty();
//判断容器是否为空resize(num);
//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。resize(num, elem);
//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除push_back(elem);
//在容器尾部加入一个元素
-
pop_back();
//删除容器中最后一个元素 -
push_front(elem);
//在容器开头插入一个元素 -
pop_front();
//从容器开头移除第一个元素 -
insert(pos,elem);
//在pos位置插elem元素的拷贝,返回新数据的位置。 -
insert(pos,n,elem);
//在pos位置插入n个elem数据,无返回值。 -
insert(pos,beg,end);
//在pos位置插入[beg,end)区间的数据,无返回值。 -
clear();
//移除容器的所有数据 -
erase(beg,end);
//删除[beg,end)区间的数据,返回下一个数据的位置。 -
erase(pos);
//删除pos位置的数据,返回下一个数据的位置。 -
remove(elem);
//删除容器中所有与elem值匹配的元素。list容器中不可以通过[]或者at方式访问数据
-
返回第一个元素 —
front()
-
返回最后一个元素 —
back()
-
reverse();
//反转链表