containers-容器

维基百科定义:

In computer science, a container is a class, a data structure,[1][2] or an abstractdata type (ADT) whose instances are collections of other objects. In other words;they are used for storing objects in an organized way following specific accessrules.

图示:

顺序性容器:

向量 vector   

是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。

双向链表list

是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。

双端队列deque 
是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效。

实际上,deque 是对vector 和list 优缺点的结合,它是处于两者之间的一种容器。

vector 、list 、deque 在内存结构上的特点

vector 是一段连续的内存块,而deque 是多个连续的内存块, list 是所有数据元素分开保存,可以是任何两个元素没有连续。

vector 的查询性能最好,并且在末端增加数据也很好,除非它重新申请内存段;适合高效地随机存储。

list 是一个链表,任何一个元素都可以是不连续的,但它都有两个指向上一元素和下一元素的指针。所以它对插入、删除元素性能是最好的,而查询性能非常差;适合大量地插入和删除操作而不关心随机存取的需求。

deque 是介于两者之间,它兼顾了数组和链表的优点,它是分块的链表和多个数组的联合。所以它有被list 好的查询性能,有被vector 好的插入、删除性能。如果你需要随即存取又关心两端数据的插入和删除,那么deque 是最佳之选。



关联容器:

set, multiset, map, multimap 是一种非线性的树结构,具体的说采用的是一种比较高效的特殊的平衡检索二叉树—— 红黑树结构。(至于什么是红黑树,我也不太理解,只能理解到它是一种二叉树结构)

因为关联容器的这四种容器类都使用同一原理,所以他们核心的算法是一致的,但是它们在应用上又有一些差别,先描述一下它们之间的差别。

set:又称集合,实际上就是一组元素的集合,但其中所包含的元素的值是唯一的,且是按一定顺序排列的,集合中的每个元素被称作集合中的实例。因为其内部是通过链表的方式来组织,所以在插入的时候比vector 快,但在查找和末尾添加上被vector 慢。

multiset:是多重集合,其实现方式和set 是相似的,只是它不要求集合中的元素是唯一的,也就是说集合中的同一个元素可以出现多次。

map :提供一种“键- 值”关系的一对一的数据存储能力。其“键”在容器中不可重复,且按一定顺序排列(其实我们可以将set 也看成是一种键- 值关系的存储,只是它只有键没有值。它是map 的一种特殊形式)。由于其是按链表的方式存储,它也继承了链表的优缺点。

multimap :和map 的原理基本相似,它允许“键”在容器中可以不唯一。

顺序容器示例:

//顺序容器list
#include<iostream>
#include<list>
using namespace std;

int main()
{
    list<int> list_object;
    
    for(int i = 0;i <=5;i++)
        list_object.push_back(i);
        
    cout<<"List containers:\n";
    list<int>::iterator iter;
    
    for(iter = list_object.begin();iter != list_object.end();iter++)
        cout<<*iter<<" ";
        
    cout<<endl;
    cout<<"Setting all entries to 0:\n";
    for(iter = list_object.begin();iter != list_object.end();iter++)
        *iter = 0;
        
    cout<<"List now containers:\n";
    for(iter = list_object.begin();iter != list_object.end();iter++)
        cout<<*iter<<" ";
        
    cout<<endl;
    
    return 0;
    
}

结果:

List containers:
0 1 2 3 4 5 
Setting all entries to 0:
List now containers:
0 0 0 0 0 0
时间: 2024-10-14 11:12:30

containers-容器的相关文章

Working with Containers

回顾之前学习过的一些命令 docker run -i...交互式运行 docker run -d...background运行`daemon`守护进程 docker ps...Lists containers.(容器列表) docker logs...Shows us the standard output of a container.(显示容器的标准输出) docker stop...Stops running containers. docker命令格式: [sudo] docker [c

docker创建数据卷以及数据卷容器

docker容器管理有2中方式: 1:数据卷:类似Linux下目录挂载mount 2:数据卷容器:其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的 使用docker search xxx //xxx指的是搜索相应的镜像.搜索后根据自己需求进行pull 下载镜像 [email protected] :~# docker pull jdeathe/centos-ssh 查看pull后的镜像 [email protected] :~# docker images REPOSITORY    

[转载]Laravel Container (容器) 深入理解 (下)

本文大部分翻译自 DAVE JAMES MILLER 的 <Laravel's Dependency Injection Container in Depth> . 上文介绍了 Dependency Injection Containers (容器) 的基本概念,现在接着深入讲解 Laravel 的 Container. Laravel 中实现的 Inversion of Control (IoC) / Dependency Injection (DI) Container 非常强悍,但文档中

docker镜像与容器管理(二)

镜像: 静态的只读文件,是一个只读的模板. 容器: 是从镜像创建的一个运行实例,容器是带有运行时需要的可写文件层. 镜像工作原理:     启动一个新的容器时,docker会加载镜像,在镜像之上添加一个读写层,     并将镜像中的目录复制一份到/var/lib/docker/containers/容器ID的目录下,     容器内修改已存在的文件,会将该文件从只读层复制到读写层,并覆盖只读层的文件,实现了文件系统隔离,     当删除容器后,读写层的数据将会删除,镜像不变. 镜像文件存储:  

修改Docker容器启动配置参数

有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker container update --restart=always 容器名字 2.直接改配置文件 首先停止容器,不然无法修改配置文件 配置文件路径为:/var/lib/docker/containers/容器ID 在该目录下找到一个文件 hostconfig.json ,找到该文件中关键字 Resta

Docker容器日志管理介绍

Docker容器日志分为2类: Docker引擎日志(Docker本身运行的日志). 容器日志,各个容器内产生的日志. Docker引擎日志Centos系统下Docker引擎log一般给systemd管理,可通过 journalctl -u docker.service 命令查看. 容器日志一.查看日志命令docker logs 容器ID 显示当前运行容器的log,输出Linux下的STDOUT(标准输出).STDERR(标准错误输出),docker logs 显示的内容包含STDOUT和STD

docker给已经启动容器添加挂载目录

docker添加挂载目录:先在docker容器里创建目录/import 1.关闭docker:/etc/init.d/docker stop2.sudo su切换到root身份,cd /var/lib/docker/containers/容器id/,进入对应容器目录3.vi hostconfig.json,修改如下,将容器目录/import绑定到主机/data目录: "Binds": ["/data:/import"], 4.vi config.v2.json,修改

docker挂载volume的用户权限问题,理解docker容器的uid

docker挂载volume的用户权限问题,理解docker容器的uid目录遇到的问题原因容器共享宿主机的uid如果不指定user,容器内部默认使用root用户来运行容器内部用户的权限与外部用户相同一定要确保容器执行者的权限和挂载数据卷对应一个更加明显的demo参考docker挂载volume的用户权限问题,理解docker容器的uid 在刚开始使用docker volume挂载数据卷的时候,经常出现没有权限的问题.这里通过遇到的问题来理解docker容器用户uid的使用,以及了解容器内外uid

docker容器和虚拟机的比较

containers:容器是在应用层的抽象化,多个容器能够运行在同一台机器上,和其他容器共享操作系统的核,每个容器运行都独立的运行在用户的空间内.容器需要的空间比虚拟机要小(容器镜像的大小一般为MBs级别的),容器能够处理更多的应用程序,并且需要更少的资源. virtual machines:虚拟机是物理硬件层的抽象化,让一个服务器转变成多个服务器.管理程序允许多个虚拟机运行在同一台机器上.每个虚拟机都包括操作系统,应用程序,必要的二字节文件和库(虚拟机的大小一般为GBs级别),虚拟机的启动也比

k8s内运行ubuntu容器

k8s内运行ubuntu镜像 环境 互相能访问的4台机器master,node01,node02,node03,4核心,内存8G 使用root操作 安装k8s 在master安装docker.kubeadm 添加kubernetes软件源: 在/etc/apt/sorce.list中添加一行:deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main 添加秘钥 apt-key adv --recv-keys --key