STL容器及适配器

STL容器

 

1.序列式容器

: vector,deque,list

每个元素都有固定的位置(取决于插入的时机和位置,与元素值无关)。

 

vector

特点:
将一个元素置于一个动态数组中加以管理,可以随机存取元素。在数组尾部添加或删除元素非常快速,但是在中部或头部插入或删除元素比较耗时。

deque

“double-ended queue” 双端队列,可以随机存取。数组尾部或头部添加或删除元素非常快速,但在中部插入或删除元素比较费时。实际上,deque 是对vector 和list 优缺点的结合,它是处于两者之间的一种容器。

list

双向链表,不提供随机存取(按顺序存储),在任何位置插入或删除动作都非常迅速。只能顺序访问(从前向后或者从后向前)。与前面两种容器类有一个明显的区别就是:它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。而且缺少下标预算符:operator[]。

vector

向量 相当于一个数组
    在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。
   优点:(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组
               进行动态操作。通常体现在push_back() pop_back()
               (2) 随机访问方便,即支持[ ]操作符和vector.at()
               (3) 节省空间。
   缺点:(1) 在内部进行插入删除操作效率低。
               (2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。
                (3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放 。

操作:

1插入和删除操作push_back,pop_back(只能在数组尾部进行),删除特定位置元素erase;

2返回固定位置的元素at(int n),支持【】操作,头和尾元素front,back;

3返回头或尾的指针用begin,end;

4其他:size,swap,empty;


list
    双向链表
    每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。
   优点:(1) 不使用连续内存完成动态操作。
               (2) 在内部方便的进行插入和删除操作
               (3) 可在两端进行push、pop
   缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at()
               (2) 相对于verctor占用内存多

  操作:

       

函数名    说明

assign()    给list赋值back()   返回最后一个元素begin()    返回指向第一个元素的迭代器

clear()  empty()  erase() 删除一个元素 remove()从list删除元素

remove_if()     按指定条件删除元素

front()     返回第一个元素  end()       返回末尾的迭代器

insert()     插入一个元素到list中pop_back()       删除最后一个元素

pop_front()     删除第一个元素push_back()       在list的末尾添加一个元素

push_front()    在list的头部添加一个元素

reverse()  把list的元素倒转

size()       返回list中的元素个数

sort()       给list排序

splice()     合并两个list,源list的内容部分或全部元素删除,拼插入到目的list

swap()     交换两个list

unique()   删除list中重复的元素



deque
   双端队列 double-end queue
   deque是在功能上合并了vector和list。
   优点:(1) 随机访问方便,即支持[ ]操作符和vector.at()
               (2) 在内部方便的进行插入和删除操作
               (3) 可在两端进行push、pop
   缺点:(1) 占用内存多
  操作:

pop_back() 删除尾部的元素pop_front() 删除头部的元素

push_back() 在尾部加入一个元素push_front() 在头部加入一个元素

其他vector有的他也有。(与vector区别就是他多一个头部插入和删除的功能)

 

 


使用区别:
     1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector 
     2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list 
     3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

 

 

2.关联式容器

:set,multiset, map, multimap

元素位置取决于特定的排序准则,与插入顺序无关。

   

    

 

 

关联容器和顺序容器的本质区别: 

关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么。

 

都支持find、count、insert、erase操作。

 

Sets/Multisets:
内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现(实际上基于红黑树(RB-tree)实现),便于查找;

  操作:

       

 

Maps/Multimaps:

Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现(实际上基于红黑树(RB-tree)实现),便于查找;

map就是一个容器,里面装的就是若干个pair。每个pair的第一个元素,称为键(注意键的类型必须支持小于(<)操作),第二个元素,称为值。对于普通的map,每个键都对应一个值。这样的看起来,键类似于数组的下标,而值类似于数组的值。

 

 

 

STL容器适配器

:栈stack 、队列queue 和优先级priority_queue

 

适配器是容器的接口,它本身不能直接保存元素,它保存元素的机制是调用

另一种顺序容器去实现,即可以把适配器看作“它保存一个容器,这个容器再保
存所有元素”。(不能由迭代器访问元素或者数组下表访问元素)
*STL 中提供的三种适配器可以由某一种顺序容器去实现。默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现。由于适配器的特点,一个适配器不是可以由任一个顺序容器都可以实现的。栈stack 的特点是后进先出,所以它关联的基本容器可以是任意一种顺序容器,因为这些容器类型结构都可以提供栈的操作有求,它们都提供了push_back 、pop_back 和back 操作。队列queue 的特点是先进先出,适配器要求其关联的基础容器必须提供pop_front 操作,因此其不能建立在vector 容器上。

 

//插入和删除push,pop(注意区分不同数据结构此操作区别)无insert操作。

//均有清空及返回数据个数的操作,无erase操作;

//返回顶或头、尾,用top,(front,back)》》不能由迭代器访问元素或者数组下标访问元素

 

1 Stacks(堆栈)
C++ Stack(堆栈)是一个容器类的改编,为程序员提供了堆栈的全部功能,—
—也就是说实现了一个先进后出(FILO)的数据结构。
1.empty() 堆栈为空则返回真
2.pop() 移除栈顶元素
3.push() 在栈顶增加元素
4.size() 返回栈中元素数目
5.top() 返回栈顶元素
2 C++ Queues(队列)
C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。
1.back() 返回一个引用,指向最后一个元素
2.empty() 如果队列空则返回真
3.front() 返回第一个元素
4.pop() 删除第一个元素
5.push() 在末尾加入一个元素
6.size() 返回队列中元素的个数
3 Priority Queues(优先队列)
C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有
序。(http://www.cnblogs.com/heqinghui/archive/2013/07/30/3225407.html)
1.empty() 如果优先队列为空,则返回真
2.pop() 删除第一个元素

3.push() 加入一个元素
4.size() 返回优先队列中拥有的元素的个数
5.top() 返回优先队列中有最高优先级的元素

 

#include<queue> 

#include<vector> 

//定义结构,使用运算符重载,自定义优先级1  
struct cmp1{  
    bool operator ()(int &a,int &b){  
        return a>b;//最小值优先  
    }  
};  
struct cmp2{  
    bool operator ()(int &a,int &b){  
        return a<b;//最大值优先  
    }  
};  
//定义结构,使用运算符重载,自定义优先级2  
struct number1{  
    int x;  
    bool operator < (const number1 &a) const {  
        return x>a.x;//最小值优先  
    }  
};  
struct number2{  
    int x;  
    bool operator < (const number2 &a) const {  
        return x<a.x;//最大值优先  
    }  
};  
    priority_queue<int>que;//采用默认优先级构造队列  
  
    priority_queue<int,vector<int>,cmp1>que1;//最小值优先  
    priority_queue<int,vector<int>,cmp2>que2;//最大值优先  
    priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,  
                                                      //这是右移运算符,所以这里用空格号隔开  
    priority_queue<int,vector<int>,less<int> >que4;最大值优先  

 

转载于:https://www.cnblogs.com/biggan/p/STL.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Html5 Canvas斗地主游戏

过完年来公司&#xff0c;没什么事&#xff0c;主管说研究下html5 游戏&#xff0c;然后主管就给了一个斗地主的demo&#xff0c;随后我就开始看代码&#xff0c; 现在我看了html5以及canvas相关知识和斗地主的demo后&#xff0c;自己用demo上的素材试着写了个斗地主&#xff0…

java流的传递方式是_如何在方法中流式传输Java List(Varargs)的值?

我有以下方法&#xff1a;public static List getValuesExclusion(A exclusion) {return Arrays.stream(values()).filter(item -> item ! exclusion).collect(Collectors.toList());}//this function returns enum list of A types that has no A typeexclusion现在我想将它…

JAVA作业——JAVA课程的总结及学习计划

JAVA作业——JAVA课程的总结及学习计划 NO.1 总结 在上一年的学习中&#xff0c;对JAVA语言比较陌生&#xff0c;英语基础不好&#xff0c;so学习起来有点困难&#xff0c;对JAVA的一些语法和编程记得比较少。 NO.2 计划 对过去一年的认真反思之后&#xff0c;我的计划如下&…

由LintCode问题子集出发,浅析ArrayList的拷贝问题

在做LintCode上的递归类题目子集时&#xff0c;我一开始的想法是递归到最后一层即单元素时然后开始逐层返回&#xff0c;产生相应的每层的子集并添加到最终的结果中去。于是乎有了以下代码&#xff1a; public List<List<Integer>> findSolution(int[] nums, int b…

大小端模式详解

http://www.cnblogs.com/xinsheng/archive/2012/04/18/2455039.html 端模式&#xff08;Endian&#xff09;的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类&#xff0c;从圆头开始将鸡蛋敲开的人被归为Big Endian&#xf…

.NET 跨平台服务端资料

OWIN Web API: http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api 用于写API的 OWIN SignalR: http://www.dotnetcurry.com/signalr/915/owin-katana-signalr-web-server 用于写即时通讯的转载于:https://www.cnblogs.com/Jarvin…

mysql的查询、子查询及连接查询

一、mysql查询的五种子句 where子句&#xff08;条件查询&#xff09;&#xff1a;按照“条件表达式”指定的条件进行查询。 group by子句&#xff08;分组&#xff09;&#xff1a;按照“属性名”指定的字段进行分组。group by子句通常和count()、sum()等聚合函数一起使用。 h…

BZOJ-1192-鬼谷子的钱袋

描述 鬼谷子非常聪明&#xff0c;正因为这样&#xff0c;他非常繁忙&#xff0c;经常有各诸侯车的特派员前来向他咨询时政。有一天&#xff0c;他在咸阳游历的时候&#xff0c;朋友告诉他在咸阳最大的拍卖行&#xff08;聚宝商行&#xff09;将要举行一场拍卖会&#xff0c;其中…

lamp 独立mysql_lamp or lnmp 环境搭建之独立安装mysql数据库

lamp or lnmp 环境搭建,如果mysql 是独立安装的则需要授权&#xff1a;单独一台服务器独立安装mysql安装后&#xff0c;优化服务器。授权实例如下&#xff1a;创建用户CREATE USER demo IDENTIFIED BY “passwd123”;授权使用mysql数据库下面的所有表GRANT ALL PRIVILEGES ON m…

item 24: 区分右值引用和universal引用

本文翻译自《effective modern C》&#xff0c;由于水平有限&#xff0c;故无法保证翻译完全正确&#xff0c;欢迎指出错误。谢谢&#xff01; 博客已经迁移到这里啦 古人曾说事情的真相会让你觉得很自在&#xff0c;但是在适当的情况下&#xff0c;一个良好的谎言同样能解放你…

WebLogic11g-常用运维操作

转自&#xff1a;https://dead-knight.iteye.com/blog/1940399 希望这篇能把weblogic运维时经常遇到的问题、常用的配置汇总到一起。 1、配置jvm参数&#xff1a; 一般在domain启动过程中会看到以下启动的日志信息&#xff0c;如下图所示&#xff1a; 图中红色方框部分为启动we…

牛腩新闻发布系统(一):SQLHelper重构(一)

导读&#xff1a;在机房重构的时候&#xff0c;就用到了SQLHelper&#xff0c;但那时候即使把代码反复看了很多遍&#xff0c;也看了注释&#xff0c;还和同学交流&#xff0c;也依然是半懂不懂。现在&#xff0c;我再次用到了SQLhelper这个东西&#xff0c;就来说说SQLHelper是…

OPENCV图像轮廓检测

前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像轮廓检测. 一.图像轮廓检测 在opencv中,轮廓对应着一系列的点的集合,open…

mysql 5.7.11 授权_mysql 5.7.11 安装配置教程

六步轻松搞定mysql5.7.11的安装1、下载安装包。mysql-5.7.11版本&#xff1a;2、拷贝到任意盘&#xff1a;例如&#xff0c;解压后拷贝文件夹至C盘&#xff1a;C:\Program Files\mysql。建议文件夹名字使用英文。3、配置环境变量&#xff1a;计算机—>右键—>高级系统设置…

iOS 面试之Block

转自&#xff1a;http://blog.csdn.net/xunyn/article/details/11658261 1 什么是block 对于闭包&#xff08;block),有很多定义&#xff0c;其中闭包就是能够读取其它函数内部变量的函数&#xff0c;这个定义即接近本质又较好理解。对于刚接触Block的同学&#xff0c;会觉得有…

当安全遇到大数据 “永恒之蓝”也将无所遁形!

文章讲的是当安全遇到大数据 “永恒之蓝”也将无所遁形&#xff01;5月12日&#xff0c;席卷全球的勒索病毒“永恒之蓝”让全世界都为之震动&#xff0c;这是迄今为止全球最大规模的勒索病毒网络攻击&#xff0c;100多个国家受到病毒感染&#xff0c;国内中石油、公安内网、高校…

[ES] 安装

1.ElasticSearch安装的准备工作 Linux&#xff1a;CentOS6.4 Elasticsearc:elasticsearch-2.2.0 JDK:jdk-7u79-linux-x64 IK:1.8.0 MAVEN:apache-maven-3.3.3-bin 2.配置网络静态文件 虚拟机设置桥接模式 配置&#xff1a;vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVIC…

语言基础之description方法

1.description方法的一般用处 1: // 指针变量的地址 2: NSLog("%p", &p); 3: // 对象的地址 4: NSLog("%p", p); 5: // <类名&#xff1a;对象地址> 6: NSLog("%", p); 1: Class c [Person class]; 2: …

亚信安全协助绿谷制药确保“秘方”安全

近几年&#xff0c;我国医药生物技术发展态势迅猛&#xff0c;加强知识产权保护己成为当务之急。为确保制药配方数据和生产管理信息系统安全&#xff0c;上海绿谷制药有限公司采用亚信安全服务器深度安全防护系统&#xff08;Deep Security&#xff09;和亚信安全防毒墙网络版&…

mysql判断叠字_格律诗的八大语法特点

古风的语法&#xff0c;本来就和散文的语法大致相同&#xff0c;直到近体诗&#xff0c;才渐和散文不同&#xff0c;原因是&#xff0c;首先在区区五字或七字之中&#xff0c;要施展丰富的想象&#xff0c;不能不力求简洁&#xff0c;凡可省去而不至于影响语意的字&#xff0c;…