目录
1、list的使用
1.1 list的构造
1.2 list的遍历
1.3 list capacity
1.4 list element access
1.5 容量相关
list是一个带头双向循环链表
1、list的使用
1.1 list的构造
1.2 list的遍历
list只有两种遍历方式,因为没有operator[]
因为list的双向链表,所以是支持反向迭代器的,像forword_list是单链表,则只能支持正向迭代器
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
list<int>::iterator it = lt.begin();
while (it != lt.end())
{
cout << *it <<" ";
++it;
}
cout << endl;
for (auto e : lt)
{
cout << e << " ";
}
return 0;
}
1.3 list capacity
1.4 list element access
1.5 容量相关
迭代器的分类:
支持的操作接口的角度:单向(forword_list)、双向(list)、随机(vector)
使用场景角度:(正向迭代器+反向迭代器) + const迭代器
forword_list的迭代器只能正着走
list的迭代器即可正着走,也可反着走
vector的迭代器即可正着走,也可反着走,还可以+=,即一下子跳跃几个
list的迭代器是不支持+=的,即一次只能前进或后退一个
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
list<int>::iterator it = lt.begin();
//在3的前面插入一个30
lt.insert(lt.begin() + 2, 30);
//这样是会报错的,正确的做法是使用find先找到
return 0;
}
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
list<int>::iterator pos = find(lt.begin(), lt.end(), 3);
//这里一定要判断一下,因为若没找到会变成尾插,而想要的是在3之后插入,变成尾插是错的
if (pos != lt.end())
{
lt.insert(pos, 30);
}
return 0;
}
关于list的迭代器失效问题,在vector中,只要是扩容操作或erase操作都可能导致迭代器失效,而list中只有erase操作才会导致迭代器失效
clear是清空链表中除了头节点以外的所有结点
splice是将一个链表连接到另一个链表中
remove是找到所给的值,并直接将这个值删除
sort可对链表中的值排序
reverse是对链表进行逆置