• C++标准库
  • std::list
  • 容器
  • 算法
  • 链表

摘要:本文是“C++标准库导引系列”的一部分。std::list可能在许多时候被人们忘记,我自己就似乎忘记了这容器,当我在写这个系列的文章的时候,我意识到原来std::list有时是更好的选择。std::list提供一个链表的实现,它是基于结点的容器,同时它也提供了许多标准算法的特殊版本,因为此时有更好的方法。

我们已经写了这个系列的好几篇文章了,本文跟之前的文章结构类似,首先给出一个基本的使用。由于std::list提供许多自定义的算法,所以本文也会把这一点体现出来。下面从基本的使用开始,为了使用std::list我们只需要如下:

#include<list>
//定义一个空的std::list容器
std::list<int> list;

//定义含有n个int()的容器
std::list<int> linst(n);

//产生一个list,并从迭代器中读取内容
std::list<int> list(begin, end);

当我们已经有一个std::list在这里的时候,我们需要对它进行操作,相对容器而言它的基本操作就是插入与删除元素,同时提供一些额外的操作诸如排序或合并等等。这些操作std::list都存在,但它有自己的优势,它往往有指针来完成操作,而不是简单的复制。

#include<list>
class Type;
std::list<Type> list;

//我们需要指定一个位置,因为std::list不如std::set会自动确定位置
Type value;
list.insert(list.begin(), value);

Type array[]={12, 12, 43, 87};
const size_t array_size=sizeof(array)/sizeof(array[0]);
list.insert(list.end(), array, array+array_size);

//把数据追加到容器最后
list.push_back(value);
//把数据追加到容器头部,这没有什么性能问题
list.push_front(value);

//从表的尾或头删除数据
list.pop_back();
list.pop_front();

上面的代码对于大部分容器来说都是常见的,但是std::list提供的特殊成员函数我们也要强调,下面就是这个特殊的函数,存在sort、splice、unique和merge算法。

//对表内的元素进行排序
list.sort();
//把连续相等的元素删除,留下唯一的值
list.unique();

std::list<int> list_2;
//把list中的元素拼接到list_2
list_2.splice(list_2.begin(), list);
//还可以有选择地拼接
list_2.splice(list_2.begin(), list, pos);//pos是list的一个迭代器

//merge与splice算法很相似,但它合并两个已序的容器
//merge算法把两个已序的容器合并,并且保证合并后也是已序
list.sort();
list_2.sort();
list_2.merge(list);
list_2.merge(list, op);//op是一个比较仿函数

本系列文章只是作为一个导引,所以并没有太多的细节,但作为一个示例也希望激发大家学习和使用标准库。C++在中国的现况很让人担心,大家普遍把C++当作C来使用,基本没有使用STL的意识,在C++标准出来10年之后今天还是如此,让我们很担心。

软件设计就是不断重用的过程,同时也是一个不断重构的过程

C++标准库:使用std_list作为链表相关推荐

  1. c++标准库中,含有链表的类list

    Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.STL中 end()指向的总是无效值,取值都用迭代器,用法跟指针差不多.assig ...

  2. C++知识点28——使用C++标准库(再谈迭代器)

    一.迭代器的种类 C++中的容器以及泛型算法会大量的使用迭代器 目前已经出现的迭代器有一下几种 1.输出迭代器 (OutputIterator) 输出迭代器类似于输出流(只能向输出流中写入数据),只能 ...

  3. python链表库_[转]为什么python标准库没有实现链表

    实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用. 如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常 ...

  4. c++标准库 及 命名空间std

    1.命名空间std C++标准中引入命名空间的概念,是为了解决不同模块或者函数库中相同标识符冲突的问题.有了命名空间的概念,标识符就被限制在特定的范围(函数)内,不会引起命名冲突.最典型的例子就是st ...

  5. C++标准库简介(转)

    C++标准库的所有头文件都没有扩展名.C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能. <cname>形式的标准头文件[ <complex>例外]其 ...

  6. C++_泛型编程与标准库(六)

    C++_泛型编程与标准库(六) 图中标红部分为自己的笔记理解 1.iterator几个特定属性 vc2019的链表list迭代器部分代码 // CLASS TEMPLATE _List_iterato ...

  7. C++_泛型编程与标准库(五)

    C++_泛型编程与标准库(五) 图中标红部分为自己的笔记理解 1.容器与容器之间的关系 2.深度探索list list是双向链表,从vc2019的list源码和以下图片都可以看出 template & ...

  8. C++_泛型编程与标准库(四)

    C++_泛型编程与标准库(四) 图中标红部分为自己的笔记理解 1.注意一个特化的typedefine 2.分配器 2.2.VC2019的allocator类 1. allocate调用operator ...

  9. C++_泛型编程与标准库(三)

    C++_泛型编程与标准库(三) 图中标红部分为自己的笔记理解 1.分配器简单测试,后面还会单讲 实测VC2019在Microsoft Visual Studio\2019\Community\VC\T ...

最新文章

  1. CLOCs:3D目标检测多模态融合之Late-Fusion
  2. SpringBoot集成多数据源
  3. 第一章 TestNG框架自动化简述
  4. cuba开发_使用CUBA进行开发–与Spring相比有很大的转变?
  5. Apollo进阶课程㊵丨Azure仿真平台使用
  6. 内大计算机学院研究生奖学金,通知 | 【研究生评奖评优】关于做好浙江大学2017-2018学年计算机学院研究生学年小结及评奖评优工作的通知...
  7. Redis Cluster部署、管理和测试
  8. [vscode] markdown_index----可以为你的markdown标题添加序号的插件
  9. Python Tricks(八)—— 斐波那契数列的另类实现
  10. cNode------路由设置以及项目基本框架搭建
  11. QXDM5 中 Qt5WebKit.dll 丢失问题解决办法
  12. lammps运行Linux,Lammps安装教程
  13. python与建筑行业_Python+AI+CC,这些建模“高级功能”,90%的人不知道
  14. OpenGL,glut,glew,glfw,mesa等
  15. 高赞的6款办公神器,好用到飞起
  16. linux日志配置含义,Linux操作系统中的日志功能详解
  17. srilm 阅读文档15
  18. 《领导力》读后感笔记
  19. linux 网卡 mac 配置文件,Linux下更改网卡的MAC物理地址
  20. 图书管理系统-用户信息维护-查询

热门文章

  1. 【运筹学】表上作业法 ( 最优解判别 | 初始基可行解 | 运费修改可行性方案 | 闭回路法 )
  2. 【计算机网络】网络层 : ICMP 协议 ( ICMP 差错报文 | 差错报文分类 | ICMP 询问报文 | ICMP 应用 | Ping | Traceroute )
  3. 【计算机网络】网络层 : 网络层简介 ( 功能 | 拥塞控制 )
  4. 【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )
  5. 如何将一个数组对象 把对象的值用指定符号连接起来 再转为数组 将数组用逗号分隔...
  6. 前端开发之JavaScript基础篇四
  7. java web学习笔记-jsp篇
  8. RMQ+1/-1算法
  9. ASP.NET中常用的js代码
  10. 操作系统老师上课讲的那个根据I/O时间和CPU时间比例来为进程分配优先级的题目,I/O时间比例越大,则这个进程的优先级越高