当前位置: 首页 > news >正文

C++ STL:list|了解list|相关接口|相关操作

上篇文章:

https://blog.csdn.net/2401_86123468/article/details/154238590?spm=1001.2014.3001.5501

C++文档:
https://legacy.cplusplus.com/reference/


1.了解list

list是带头双向循环链表

也有单链表forward_list,但使用的较少:

1.1接口

通过接口了解list,发现其访问数据不支持[ ]随机访问,需要通过迭代器访问,不过支持头插头删。

list初始化,包含list头文件即可,遍历通过迭代器,当然,支持遍历器也就支持范围for:

list<int> lt1;
list<int> lt2 = { 1,2,3,4,5 };
list<int>::iterator it2 = lt2.begin();
while (it2 != lt2.end())
{cout << *it2 << " ";++it2;
}
cout << endl;for (auto e : lt2)
{cout << e << " ";
}
cout << endl;

不过接口没有提供find,要想使用find,就需要使用算法库中的。

auto pos = find(lt2.begin(), lt2.end(), 3);
if (pos != lt2.end())
{lt2.insert(pos, 30); // pos没有失效,因为没有扩容lt2.erase(pos);	     // pos失效了//cout << *pos << endl;
}for (auto e : lt2)
{cout << e << " ";
}
cout << endl;

2.相关操作

2.1reverse

逆置

2.2sort

排序

不过在算法库中也有sort,为什么还要单独为list设计一个呢?

xxx::vector<int> v3 = { 10,20,30,40 };
//sort(lt2.begin(), lt2.end()); // 不支持
sort(v3.begin(), v3.end());

通过运行上述代码,发现list不支持算法库中的sort,此时,我们需要再次深入了解迭代器,以此解惑。

2.3再次认识迭代器

迭代器从使用场景上分为:普通迭代器,常量迭代器,反向迭代器,常量反向迭代器。

使用功能分为:

单向迭代器:支持 ++

双向迭代器:支持 ++ 或 --

随机迭代器:支持 ++ 或 -- 或 + 或 -

使用功能遵循继承关系。

使用功能分类的标准是由容器底层结构决定的,而我们通过C++文档的成员类型处可以了解到迭代器的类型

下图是list,双向迭代器的表示:

单链表则为单向迭代器:

vector为随机迭代器:

由此可以明白,双向迭代器要是支持+或-,那其代价较高,为O(N)

此时,看算法库中的sort,发现其支持随机迭代器,也就是说,除非容器支持随即迭代器,否则不能使用算法库中的sort

了解find:其为输入迭代器,此迭代器类别中最基础的一种,更高阶的迭代器具备输入迭代器的所有功能,因此不论单向双向随机迭代器,都可以调用。

了解reverse:其要求容器为双向迭代器,那么通过继承关系,支持随机迭代器的容器也可以调用。

2.4merge

归并,合并有序list

2.5unique

去重,去除掉有序数据中的重复数据,只留一个

list<int> lt3 = { 1,2,2,3,3,2,3,4,5 };
for (auto e : lt3)
{cout << e << " ";
}
cout << endl;
lt3.sort();
lt3.unique(); // 去重
for (auto e : lt3)
{cout << e << " ";
}
cout << endl;

2.6remove

从链表中删除所有值等于指定参数 val 的元素

2.7remove_if

与仿函数有关(后续文章会讲),满足某个条件再删除

2.8splice

接合/粘接,将某个链表的值转移到另一个链表中

//将4这个节点挪到头位置
list<int> lt4 = { 1,2,3,4,5 };
for (auto e : lt4)
{cout << e << " ";
}
cout << endl;
pos = find(lt4.begin(), lt4.end(), 4);
lt4.splice(lt4.begin(), lt4, pos);
for (auto e : lt4)
{cout << e << " ";
}
cout << endl;

2.9assign

替换列表中现有的所有元素,用新的元素集合重新填充列表

2.10对比sort效率

首先,需要将编译器切换为release版本:

2.10.1对比vector和list的sort

void test_op1()
{srand(time(0));const int N = 1000000;list<int> lt1;vector<int> v;for (int i = 0; i < N; ++i){auto e = rand() + i;lt1.push_back(e);v.push_back(e);}int begin1 = clock();// sort(v.begin(), v.end());int end1 = clock();int begin2 = clock();lt1.sort();int end2 = clock();printf("vector sort:%d\n", end1 - begin1);printf("list sort:%d\n", end2 - begin2);
}int main()
{test_op1();return 0;
}

可见,list自身的sort效率并不高。

2.10.2将链表数据拷贝到vector,通过算法sort排序,再拷贝回list

void test_op2()
{srand(time(0));const int N = 1000000;list<int> lt1;list<int> lt2;for (int i = 0; i < N; ++i){auto e = rand() + i;lt1.push_back(e);lt2.push_back(e);}int begin1 = clock();// vectorvector<int> v(lt2.begin(), lt2.end());// sort(v.begin(), v.end());// lt2lt2.assign(v.begin(), v.end());int end1 = clock();int begin2 = clock();lt1.sort();int end2 = clock();printf("list copy vector sort copy list sort:%d\n", end1 - begin1);printf("list sort:%d\n", end2 - begin2);
}

依据vector的更高效。

本章完。

http://www.dtcms.com/a/556804.html

相关文章:

  • 【Java后端】配置属性BeanCreateException异常,使用默认值语法添加空串
  • 指针深入第二弹--字符指针、数组指针、函数指针、函数指针数组、转移表的理解加运用
  • 用红黑数封装实现map,set
  • PsTools 学习笔记(7.8):远程连接选项——连接性、超时、会话与安全基线
  • Java Se—异常
  • JSON.stringify() 方法详解
  • DevOps工具链对比,Azure 和 TikLab哪款更好用?
  • 安徽省住房城乡建设厅门户网站深圳百度快速排名优化
  • 一种无需IP核的FPGA RAM初始化方法:基于源码定义与赋值实现
  • openpnp - 坐标系统只有一个
  • 前端新技术解读:WebAssembly、Web Components 与 Tailwind CSS
  • 做a爱片网站做山西杂粮的网站
  • mysql保存二进制数据
  • 目标跟踪 deepsort
  • 网站建设前的分析第一小节内容好看网页设计
  • SAP PP生产版本批量维护功能分享
  • 【Linux】当遇到不是root用户,无法进入root用户,却仍需要使用sudo命令时
  • Python 生成书法字体(以瘦金体为例)
  • Advanced Science 国防科大开发1.8克人仿生眼球,实现微型化与功能集成度兼具!
  • 数据结构05:顺序表经典算法
  • 静态网站开发课程深圳东门网红打卡地
  • Ubuntu 24.04下编译支持ROCm加速的llama.cpp
  • 如何在DCU上面编译llama.cpp
  • 具身导航轨迹规划与主动想象融合!DreamNav:基于轨迹想象的零样本视觉语言导航框架
  • AWS + SEO:让网站从服务器层面赢在搜索引擎起跑线
  • 深度学习(9)导数与计算图
  • 好看的网站建设公司中企动力网站建设公司
  • JavaSe—泛型
  • ssm面试题梳理
  • 基于MATLAB的二维图像三维重建算法比较研究