360网站制作,沈阳专业制作网站公司哪家好,网站简繁转换代码,北京企业网站优化个人主页 #xff1a; zxctscl 如有转载请先通知 文章目录 1. list介绍2. list的构造3. ist iterator的使用4. capacity5. element access6. modifiers7. 迭代器失效8. Operations8.1 reverse8.2 sort8.3 unique8.4 splice 1. list介绍 list是可以在常数范围内在任意位置进行插… 个人主页 zxctscl 如有转载请先通知 文章目录 1. list介绍2. list的构造3. ist iterator的使用4. capacity5. element access6. modifiers7. 迭代器失效8. Operations8.1 reverse8.2 sort8.3 unique8.4 splice 1. list介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器并且该容器可以前后双向迭代。list的底层是双向链表结构双向链表中每个元素存储在互不相关的独立节点中在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似最主要的不同在于forward_list是单链表只能朝前迭代已让其更简单高效。与其他的序列式容器相比(arrayvectordeque)list通常在任意位置进行插入、移除元素的执行效率更好。与其他序列式容器相比list和forward_list最大的缺陷是不支持任意位置的随机访问比如要访问list的第6个元素必须从已知的位置(比如头部或者尾部)迭代到该位置在这段位置上迭代需要线性的时间开销list还需要一些额外的空间以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)
list中的接口比较多此处类似只需要掌握如何正确的使用然后再去深入研究背后的原理已达到可扩展的能力。以下为list中一些常见的重要接口。
2. list的构造 3. ist iterator的使用
此处大家可暂时将迭代器理解成一个指针该指针指向list中的某个节点。 直接看代码 listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);listint::iterator it lt.begin();while (it ! lt.end()){cout *it ;it;}cout endl;for (auto e : lt){cout e ;}cout endl;注意
begin与end为正向迭代器对迭代器执行操作迭代器向后移动rbegin(end)与rend(begin)为反向迭代器对迭代器执行操作迭代器向前移动
4. capacity 5. element access 6. modifiers 7. 迭代器失效
迭代器失效即迭代器所指向的节点的无效即该节点被删除了。因为list的底层结构为带头结点的双向循环链表因此在list中进行插入时是不会导致list的迭代器失效的只有在删除时才会失效并且失效的只是指向被删除节点的迭代器其他迭代器不会受到影响。
list的insert不会失效但是erase会失效。
void TestListIterator1()
{int array[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };listint l(array, array sizeof(array) / sizeof(array[0]));auto it l.begin();while (it ! l.end()){l.erase(it);it;}
}erase()函数执行后it所指向的节点已被删除因此it无效在下一次使用it时必须先给 其赋值 修改一下代码
void TestListIterator()
{int array[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };listint l(array, array sizeof(array) / sizeof(array[0]));auto it l.begin();while (it ! l.end()){l.erase(it); // it l.erase(it);}}8. Operations 8.1 reverse
reverse逆置 来看看代码; listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout e ;}cout endl;lt.reverse();for (auto e : lt){cout e ;}cout endl;8.2 sort sort默认排的是升序来看看代码 listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout e ;}cout endl;lt.reverse();for (auto e : lt){cout e ;}cout endl;lt.sort();for (auto e : lt){cout e ;}cout endl; 排降序的话得加一个仿函数 listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout e ;}cout endl;lt.sort(greaterint());for (auto e : lt){cout e ;}cout endl;8.3 unique
去重要求先排序 来看看代码 listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(2);lt.push_back(2);lt.push_back(4);lt.push_back(5);lt.push_back(2);for (auto e : lt){cout e ;}cout endl;lt.sort();for (auto e : lt){cout e ;}cout endl;lt.unique();for (auto e : lt){cout e ;}cout endl;8.4 splice
splice是转移的意思但是转移的链表类型必须是相同的。 举个例子把第一个位置的值拿出来也就是1.然后2 3 4依此往前挪最后插入到最后面。只是改变节点的指向。
代码 listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout e ;}cout endl;lt.splice(lt.end(), lt, lt.begin());for (auto e : lt){cout e ;}cout endl;也可以把一个链表的一部分转移到另一个节点上 看代码 listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout e ;}cout endl;listint lt1;lt.push_back(10);lt.push_back(20);lt.push_back(30);lt.push_back(40);lt.splice(lt.begin(), lt1);for (auto e : lt){cout e ;}cout endl; 有问题请指出大家一起进步