List
1.list 简单介绍
- list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
- list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
- 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2.list的使用
2.1list的构造函数
list (size_type n, const value_type& val = value_type())
构造的list中包含n个值为val的元素
list() 构造空的list
list (const list& x) 拷贝构造函数
list (InputIterator first, InputIterator last)
用[first, last)区间中的元素构造list
代码实践
list<int> l1(5,6);size为5,元素为6的list。
list<int> l2;
list<int> l3(l1);拷贝构造
list<int> l4(l1.begin(),l1.end());
一定要传迭代器的区间!如果前后两个迭代器是同一个迭代器,将无法被初始化
2.2 list 容量查看
empty() 检测list是否为空,是返回true,否则返回false.
size() 返回list中有效节点的个数.
代码实践
list<char> l1;
bool truth = l1.empty();
size_t sz = l1.size();
2.3 list 元素访问
front 返回list的第一个节点中值的引用。
back 返回list的最后一节点中值的引用。
代码实践
list<int> l1 = {1,2,3,4,5};
cout<<l1.front()<<" "<<l1.back()<<endl;
结果为1 5
2.4 list 增删查改
push_front 在list首元素前插入值为val的元素
pop_front 删除list中第一个元素
push_back 在list尾部插入值为val的元素
pop_back 删除list中最后一个元素
insert 在list position 位置中插入值为val的元素
erase 删除list position位置的元素
swap 交换两个list中的元素
clear 清空list中的有效元素
代码实践
list<int> l1 = { 1,2,3,4,5 };
无需迭代器:
l1.push_front(1);
l1.pop_front();
l1.push_back(6);
l1.pop_back();
需要迭代器:
l1.insert(l1.begin(),2);
l1.erase(l1.begin());
重点:不可以传l1.end(), l1.erase(l1.end())是不被允许的
因为li.end()对应的迭代器并不是list的最后一个元素。
需要两个迭代器:
list<int> l1;
list<int> l2;
l1.swap(l2);
l1.clear().清除所有节点
2.5 list迭代器
list的底层结构为带头结点的双向循环链表。
begin是 头节点的下一个节点。
end是头节点。
begin++ 是向后移
rbegin 和rend 与 begin和end 是相反的关系。
rbegin++ 是向前移。
带c是指 const。
2.6 list的迭代器失效
因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响.
如何避免:在使用迭代器之前,将迭代器进行更新!