ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【C++】双向奔赴的链表:list 使用全指南

【C++】双向奔赴的链表:list 使用全指南 一List容器介绍list容器的本质上是一个双向带头循环链表节点在物理空间上是不连续的list的节点在堆上分散分配每个节点包含数据、前驱指针和后继指针。特点1插入和删除极快不需要挪动元素2不支持随机访问3空间开销较大每个元素需要额外开辟两个指针二List的构造函数list的四种构造list的大部分功能都和之前的容器string和vector有相似性这里就不在过多阐述具体可以看一看我前两期的博客string类的使用【C】String类的使用含模拟实现_c string类-CSDN博客掌握 vector 的增删遍历从数组到动态数组掌握 vector 的增删遍历-CSDN博客下面看一下和前面容器不同的地方1迭代器部分先看一下迭代器的分类由上表可知list使用的是双向迭代器不支持-操作从右边到左边功能依次减小而算法库当中的算法对迭代器的要求不同使得一些容器不能使用某些算法例如上面sort需要随机迭代器才能使用但是list容器的迭代器是双向迭代器因此list不能使用算法库当中的sort再举几个例子代码展示2函数部分1insert插入void test03() { listint it; it.push_back(1); it.push_back(2); it.push_back(3); it.push_back(4); it.push_back(5); it.push_back(6); for (auto ch : it) { cout ch ; } cout endl; //在指定位置插入数据 auto v it.begin(); int k 3;//在begin()3前插入数据 while (k--) { v; } it.insert(v, 34); for (auto ch : it) { cout ch ; } cout endl; }运行结果2删除元素erasevoid test00() { listint it; it.push_back(1); it.push_back(2); it.push_back(3); it.push_back(4); it.push_back(5); it.push_back(6); for (auto ch : it) { cout ch ; } cout endl; //删除指定元素 int x; cin x; auto f1 find(it.begin(), it.end(), x); if (f1 ! it.end()) { it.erase(f1); } for (auto ch : it) { cout ch ; } cout endl; }运行展示3排序sort和逆置reverse注意reverse的两个参数是迭代器区间但是reverse的区间为[first , last),last指向的是翻转区间的下一个元素实际翻转时只会翻转first到last的前一个元素这个范围内的数//排序和翻转 void test04() { listint it; it.push_back(1); it.push_back(20); it.push_back(3); it.push_back(4); it.push_back(5); it.push_back(3); it.push_back(5); it.push_back(6); for (auto ch : it) { cout ch ; } cout endl; //进行排序 it.sort(); //正序 //sort(it.begin(), it.end()); //无法使用算法库当中的sort //翻转--两种都可以 //it.reverse();//list的翻转 reverse(it.begin(), it.end());//算法库当中的翻转--反转后为逆序 for (auto ch : it) { cout ch ; } cout endl; }运行结果4链表合并merge代码部分//merge void test004() { std::listdouble first, second; first.push_back(1.2); first.push_back(4.1); first.push_back(5.6); first.push_back(3.4); second.push_back(2.1); second.push_back(6.7); second.push_back(8.6); second.push_back(9.2); //先进行排序 first.sort(); second.sort(); //粘接(剪切粘贴)--将second中的值直接拿到first当中 first.merge(second);//粘接后second中的内容为空 for (auto ch : first) { cout ch ; } cout endl; }运行结果运行这一行前运行后5去除重复元素unique代码展示//unique删除重复的元素--需要有序,相同的元素紧挨着 void test05() { listint it; it.push_back(1); it.push_back(2); it.push_back(3); it.push_back(2); it.push_back(4); it.push_back(3); it.sort(); for (auto ch : it) { cout ch ; } cout endl; it.unique(); for (auto ch : it) { cout ch ; } cout endl; }运行结果6链表元素转接splice可以对不同的链表进行上面的操作也可以对自己进行上面的操作代码展示//splice链表转接 void test06() { listint first1, first2; listint::iterator ch; for (int i 1;i 7;i) { first1.push_back(i); } for (int j 1;j 5;j) { first2.push_back(j * 10); } ch first1.begin(); ch; //转接到2之前 first1.splice(ch, first2);//转接后first2为空 for (auto ch : first1) { cout ch ; } cout endl; //splice可以用于自己--调节元素的顺序 listint it; it.push_back(1); it.push_back(2); it.push_back(3); it.push_back(2); it.push_back(4); it.push_back(3); for (auto ch : it) { cout ch ; } cout endl; int x 0; cin x; ch find(it.begin(), it.end(), x); //将遇到的首个x元素后面的数据放到指定位置 if (ch ! it.end()) { it.splice(it.begin(), it, ch, it.end()); } for (auto ch : it) { cout ch ; } cout endl; }运行结果执行下面指令的对比执行前 执行后执行后变成了0说明不是简单的复制粘贴而是剪切
返回列表