首页 > 其他分享 >92.顺序容器概述

92.顺序容器概述

时间:2023-05-11 13:45:21浏览次数:36  
标签:容器 删除 元素 list 访问 vector 概述 92

  一个容器就是一些特定类型对象的集合。顺序容器(sequential container)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器 时的位置相对应。可以分为有序和无序关联容器。

  标准库还提供了三种容器适配器,分别为容器操作定义了不同的接口,来与容器类型适配。

顺序容器概述

  下表列出了标准库中的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。但是,这些容器在以下方面都有不同的性能折中:

●向容器添加或从容器中删除元素的代价
●非顺序访问容器中元素的代价

表9.1: 顺序容器类型
vector 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢
deque 双端队列。支持快速随机访问。在头尾位悝插入/删除速度很快
list 双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快
forward_list 单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快
array 固定大小数组。支持快速随机访问。不能添加或删除元素
string 与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快

  除了固定大小的array外,其他容器都提供高效、灵活的内存管理。我们可以添加和删除元素,扩张和收缩容器的大小。容器保存元素的策略对容器操作的效率有着固有的,有时是重大的影响。在某些情况下,存储策略还会影响特定容器是否支持特定操作。

  例如,string和vector将元素保存在连续的内存空间中。由于元素是连续存储的,由元素的下标来计算其地址是非常快速的。但是,在这两种容器的中间位置添加或删除元素就会非常耗时:在一次插入或删除操作后,需要移动插入/删除位置之后的所有元素,来保持连续存储。而且,添加一个元素有时可能还需要分配额外的存储空间。在这种情况下,每个元素都必须移动到新的存储空间中。

  list和forward_list两个容器的设计目的是令容器任何位置的添加和删除操作都很快速。作为代价,这两个容器不支持元素的随机访问:为了访问 个元素,我们只能遍历整个容器。而且,与vector、deque和array相比,这两个容器的额外内存开销也很大。

  deque是一个更为复杂的数据结构。与string和vector 类似,deque支持快速的随机访问。与string和vector一样,在deque的中间位置添加或删除元素的代价(可能)很高。但是,在deque的两端添加或删除元素都是很快的,与list或forward_list添加删除元素的速度相当。

  forward_list和array是新C++标准增加的类型。与内置数组相比,array是一种更安全、更容易使用的数组类型。与内置数组类似,array对象的大小是固定的。因此,array不支持添加和删除元素以及改变容器大小的操作。forward_list的设计目标是达到与最好的手写的单向链表数据结构相当的性能。因此,forward_list没有size操作,因为保存或计算其大小就会比手写链表多出额外的开销。对其他容器而言,size保证是一个快速的常量时间的操作。

注意:

新标准库的容器比旧版本快得多,原因我们将在13.6节(第470页)解释。新标准库容器的性能几乎肯定与最精心优化过的同类数据结构一样好(通常会更好)。现代C++程序应该使用标准库容器,而不是更原始的数据结构,如内置数组。

确定使用哪种顺序容器

建议:通常,使用vector是最好的选择,除非你有很好的理由选择其他容器。

以下是一些选择容器的基本原则:

●除非你有很好的理由选择其他容器,否则应使用vector。
●如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list。
●如果程序要求随机访问元素,应使用vector或deque。
●如果程序要求在容器的中间插入或删除元素,应使用list或forward_list。
●如果程序需要在头尾位置插入或删除元素,但不会在中间位控进行插入或删除操作,则使用deque。
●如果程序只有在读取输入时才需要在容器中间位置插入元素,随后需要随机访问元素,则

---首先,确定是否真的需要在容器中间位置添加元素。当处理输入数据时,通常可以很容易地向vector追加数据,然后再调用标准库的sort函数(我们将 在10.2.3节介绍sort(第343页))来露排容器中的元素,从而避免在中间位置添加元素。

---如果必须在中间位置插入元素,考虑在输入阶段使用list,一旦输入完成,将list中的内容拷贝到个vector中。

  如果程序既需要随机访问元素,又需要在容器中间位置插入元素,那该怎么办?答案取决于在list或forward_list中访问元素与vector或deque中插入/删除元素的一相对性能。一般来说,应用中占主导地位的操作(执行的访问操作更多还是插入/删除更多)决定了容器类型的选择。在此情况下,对两种容器分别测试应用的性能可能就是必要的了。

建议:如果你不确定应该使用哪种容器,那么可以在程序中只使用vector和list公共的操作:使用迭代器,不使用下标操作,避免随机访问。这样,在必要时选择使用vector或list都很方便。

参考资料:

C++ Primer

标签:容器,删除,元素,list,访问,vector,概述,92
From: https://www.cnblogs.com/codemagiciant/p/17390815.html

相关文章

  • vector容器(下)
    五、vector的插入和删除1、功能描述:对vector容器进行插入、删除操作;2、函数原型:(1)push_back(ele);//尾部插入元素ele(2)pop_back(ele); //删除最后一个元素(3)insert(const_iteratorops,ele);//迭代器指向位置pos插入元素ele(4)insert(const_iteratorpos,intcount,ele);//迭代器指向位置......
  • Kubernetes概述 (一篇教你认识k8s)
    一、Kubernetes概述 1.k8s是什么K8S的全称为Kubernetes(K12345678S),PS:“嘛,写全称也太累了吧,不如整个缩写”。作用:用于自动部署、扩展和管理“容器化(containerized)应用程序"的开源系统。可以理解成K8S是负责自动化运维管理多个容器化程序(比如Docker)的集群,是一......
  • IOC容器-Autofac
    Autofac是第三方IOC容器,是当前最流行的IOC容器。1.容器创建对象//创建一个容器建造者ContainerBuildercontainerBuilder=newContainerBuilder();//注册普通类containerBuilder.RegisterType<Honer>();//build一下,得到一个容器IContainercontainer=containerBuild......
  • 每日打卡c++中vector容器使用
    首先头文件#include<vector>for_each一种算法需要头文件#include<algorithm>标准算法头文件vector<int>::iterator迭代器,可以当指针用。基本格式vector<数据类型>名称;数据类型可以是类。例子#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;cla......
  • 【C++容器基础】
    容器汇总: 向量(vector): 队列(deque):列表(list): 数组(array): 字符串(string): 映射(map):无序 集合(set):无序不重复 ......
  • 【问题解决】Kafka报错 Bootstrap broker x.x.x.x:9092 (id: -1 rack: null) disconne
    问题复现近日针对某一客户需求开发了一个需要使用Kafka的功能,功能是什么暂且不论,在本地虚机的Kafka连接一切正常遂放到测试服务器上验证功能,以下是监听topic成功和警告报错:2023-05-0910:22:23[localhost-startStop-1]INFOorg.apache.kafka.clients.consumer.ConsumerConfig......
  • 关联映射概述
    关联映射关系在关系型数据库中,表与表之间存在着三种关联映射关系,分别为一对一关系、一对多关系和多对多关系。   一对一关系:一个数据表中的一条记录最多可以和另一个数据表中的一条记录相关。例如,现实生活中学生与校园卡就属于一对一的关系,一个学生只能拥有一张校园卡,......
  • MySQL(二十)锁(一)锁的概述与S、X锁
    MySQL(二十)锁(一)锁概述、S锁和X锁1概述锁是计算机协调多个线程或进程并发访问某一资源的机制。​ 在程序开发过程中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是一些敏感的数据(如金额、订单等),就需要保证这个数据在任何时刻都最多只有一个线程在访问,以保证......
  • 未知大小的图片适应(保持宽高比且不超出)图片容器的CSS属性
    假设我们本地代码中有一个宽*高为100px*100px的图片的容器元素<divclass="img-wrapper"style="width:100px;height:100px;"><imgsrc="..."alt="待展示图片"/></div> 如果图片不我们本地,而是属于其他人资源,那么图片的尺寸、大小对于我们来讲是不可控的。这种情......
  • 学习LXC(Linux 容器)技术
    安装LXC、LXD、zfs测试机器为ubuntusudoapt-getinstalllxclxdzfsutils-linux-y创建LXD的zfs存储池sudolxdinit##根据提示全部敲回车即可添加官方镜像源sudolxcremoteaddimagesimages.linuxcontainers.org查看镜像lxcimagelist[<remote>:][<filter>......