c++stl

C++ STL 教程

在前面的章节中,我们已经学习了 C++ 模板的概念。C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

组件

描述

容器(Containers)

容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。

算法(Algorithms)

算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。

迭代器(iterators)

迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求:

实例

#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
   // 创建一个向量存储 int
   vector<int> vec; 
   int i;
 
   // 显示 vec 的原始大小
   cout << "vector size = " << vec.size() << endl;
 
   // 推入 5 个值到向量中
   for(i = 0; i < 5; i++){
      vec.push_back(i);
   }
 
   // 显示 vec 扩展后的大小
   cout << "extended vector size = " << vec.size() << endl;
 
   // 访问向量中的 5 个值
   for(i = 0; i < 5; i++){
      cout << "value of vec [" << i << "] = " << vec[i] << endl;
   }
 
   // 使用迭代器 iterator 访问值
   vector<int>::iterator v = vec.begin();
   while( v != vec.end()) {
      cout << "value of v = " << *v << endl;
      v++;
   }
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

vector size = 0
extended vector size = 5
value of vec [0] = 0
value of vec [1] = 1
value of vec [2] = 2
value of vec [3] = 3
value of vec [4] = 4
value of v = 0
value of v = 1
value of v = 2
value of v = 3
value of v = 4

关于上面实例中所使用的各种函数,有几点要注意:

  • push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。
  • size( ) 函数显示向量的大小。
  • begin( ) 函数返回一个指向向量开头的迭代器。
  • end( ) 函数返回一个指向向量末尾的迭代器。
本文转载于网络 如有侵权请联系删除

相关文章

  • 1分钟链圈 | 马云爸爸:IoT和区块链技术正在推进互联网本身发生巨大的变化

    Hi,艾瑞巴蒂! 这里是8月23日的每日1句话新闻晚报,只需1分钟,看看全球最热、最新的区块链新闻。实时币价:BTC$6414.40ETH$272.80EOS$4.72(数据来源:Bitfinex)安全ImageMagick存在0day漏洞,可以用于远程命令执行公链EOSIO1.2.2版本发布比原链将在9月30日停止对第三方平台比原链ERC20代币兑换的技术支持观点马云:IoT和区块链技术正在推进互联网本身发生巨大的变化人民创投总经理赵亚辉:区块链为解决价值交换和信任交互提供好思路中国工程院院士柴洪峰:区块链实现大规模的产业应用需要五到十年工程院院士李京文:区块链对重庆市渝中区创造应用生态圈有重要作用安全公司负责人邓焕:目前中小型交易所对安全的认知仍有不足招商银行总行CIO陈昆德:希望底层的资产可以放到区块链里面公司加拿大研究中心建立以太坊区块链浏览器人民法院报:征信服务公司可探索引入区块链技术阿里智博会:蚂蚁金服将探索区块链等技术在重庆的应用恭喜你,今天的新闻全部看完啦。1分钟链圈事,周四打卡成功。想看详细信息?以下1分钟,让你了解个透!1.马云:IoT和区块链技术正在推进互联网本身

  • 看似简单但容易忽视的编程常识

    这些年写了很多的代码、也读过很多的人写的代码,这几年,写代码的机会越来越少,但是每次写代码,感觉需要思考的东西越来越多,好的代码确实难能可贵,在国内业界中,好的软件不少,但是好的代码确实有点凤毛麟角了,写得出来的人不多,有追求的也不多,看到的好的代码越来越少。可能是因为每个人对于好的评判标准不一,程序员中,也不乏文人相轻的较劲,总觉得比人写的代码都不够好,我不想介入这些无谓的争论,这篇文章中,我将结合我的编码经验,探讨一下,如何写出设计优良的代码,希望作为大家的参考。好的代码首先是逻辑正确的如何用编程语言表述正确的代码逻辑,这个问题好像很少有人单独拎出来讲,因为这个问题的答案很简单,简单得你都懒得去思考它,因为你肯定觉得,用编程语言正确的表述代码逻辑无非就是if、while之类的东西,有什么好探讨的,其实我要分享的并不是这些关键词的本身在逻辑中表达的含义,而是这些关键词的背后,编写程序的过程中,是否真的认真思考过背后的逻辑。 我曾不止遇到过很多有年编程经验的程序员,犯下类似的错误,也见过很多年轻的同学,反复强调纠正后,逻辑上还是会漏洞百出,这几年,我会经常组织我组里面的同学对代码进行走

  • nodejs版本控制和切换

    nvm是node.js的版本管理器,可以安装和切换不同版本node.js   1.下载nvm包 地址:https://github.com/coreybutler/nvm-windows/releases   nvm-noinstall.zip:这个是绿色免安装版本,但是使用之前需要配置 nvm-setup.zip:这是一个安装包,下载之后点击安装,无需配置就可以使用,方便。(推荐使用)   2.配置路径和下载源 如果使用nvm-noinstall.zip安装,需配置 在nvm安装路径下setting.txt文件中配置如下信息:设置nvm路径(相当于setting.txt中的root:):设置nodejs路径(相当于setting.txt中的path:):nvmnode_mirrorhttps://npm.taobao.org/mirrors/node/nvmnpm_mirrorhttps://npm.taobao.org/mirrors/npm/   3.nvm出现版本号代表安装成功   4.安装及切换使用node nvminst

  • 时序数据库 influxdb 在 windows/linux下安装

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 influxdb对linux支持非常好,但window下安装稍微有点复杂 关于linux下安装,可参考官方文档, https://jasper-zhang1.gitbooks.io/influxdb/content/Introduction/installation.html 官方中文文档 本文简单贴出centos下安装,如下: RedHat&CentOS下安装 RedHat和CentOS用户可以直接用yum包管理来安装最新版本的InfluxDB。 cat<<EOF|sudotee/etc/yum.repos.d/influxdb.repo [influxdb] name=InfluxDBRepository-RHEL\$releasever baseurl=https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://repos.influxdata.com/i

  • js 优雅的打印网络请求

    在大多数开发中,我们都不可避免的需要发起网络请求,从请求api,到文件上传,有前端发起的请求越来越多,但是网络请求的内容查看,总是有些不方便。 这个时候我结合jsconsole对象,在现有开发的网络请求函数中内嵌了一个打印网络请求信息的小方法,主要是把请求的参数,返回的结果等到进行了打印。 为了优雅的打印,网络请求的信息,最外层我使用console.groupCollapsed()折叠信息,只显示请求状态和接口核心关键词。 console.groupCollapsed([标志]接口名字[接口请求状态]); console.groupEnd(); 复制 随后就是内部的内容了,我在内部使用了console.table(),打印相对规整的请求信息,和返回信息。 内部的table核心就是key和value,其他如果有必要显示可以打印,如果没有就不需要打印。 letlogData=[{ key:"action", value:ACTION, type:typeofACTION }, { key:"data", value:data, type:typeofdata }, {

  • 【c++】字符串循环左移

    输入一个字符串和一个非负整数N,要求将字符串循环左移N次。 输入格式: 输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。 输出格式: 在一行中输出循环左移NN次后的字符串。 输入样例: HelloWorld! 2复制 输出样例: lloWorld!He复制 程序代码: #include<stdio.h> voidleft_1(char*str,intlength); voidleft_n(char*str,intlength,inttime); intmain() { //100个字符加上‘\0’需要的空间是101字节 charstr[101]; inti=0; charc; //输入字符串的方法 while((c=getchar())!='\n') { str[i]=c; i++; } str[i]='\0'; intN; scanf("%d",&N); left_n(str,i,N); //for(intj=0;j<i;j++) printf("%s",str); return0; }

  • 计算几何模板初步

    #include<set> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> usingnamespacestd; constintMAXN=1005; constdoublePi=acos(-1.0); constdoubleeps=1e-6; constdoubleINF=1e12; inlineintdcmp(doublex){//正负符号 if(x<=eps&&x>=-eps)return0; returnx>0?1:-1; } inlinedoublesqr(doublex){returnx*x;}//平方 structVector{//向量 doublex,y; inlineVector(double_x=0,double_y=0):x(_x),y(_y){} inlineVectoroperator*(constdouble&k)const{returnVector

  • 14. Jmeter-配置元件一

    jmeter-配置元件介绍与使用 CSV数据文件设置 HTTP信息头管理器 HTTPCookie管理器 HTTPCacheManager HTTP请求默认值 计数器 DNSCacheManager FTP请求缺省值 HTTP授权管理器 CSV数据文件设置 CSV数据文件设置不论在接口还是性能测试中都会经常用到的组件。简单来说就是从文件中读取数据,然后把数据赋值给变量,供脚本使用。下面我们具体用个例子来看一下 CSV数据文件设置 我们定义了一个线程组,线程数为2。添加一个HTTP请求,HTTP请求添加一个CSV数据文件设置,从a.txt读取数据。我们先来看一下a.txt的数据,如下图所示: 然后我们把读出来的数据放入key的变量,然后再HTTP请求中使用${key}引用这个变量。 运行结果 HTTP信息头管理器 HTTP信息头管理器也是我们常用的组件,就是我们常说的requesthearders。 HTTP信息头管理器实例 HTTPCookie管理器 我们可以使用HTTPCookie管理器给我们的请求添加Cookie。关于什么是Cookie,可以参考我写的另一

  • Virtual box 虚拟机 不可使用的一种解决方法

    在win7下开着一个ubuntu虚拟机,写了好几小时代码,然后饿了,去吃点东西 回来发现,电脑由于win7自动更新已经重启 ubuntu下的代码我已经走开时保存过了,所以不怎么担心 但是打开virtualbox却发现虚拟机因为win7自动重启,不可使用 NS_ERROR_FAILURE(0x80004005)Component: MachineInterface: IMachine 看了网上的解决方法 我先建了一个新的虚拟机 然后virtualbox管理界面里给新的虚拟机添加上原来的磁盘vmdk 一般第二块磁盘为sdb 使用修复命令sudo fsck/dev/sdb1 结束后,你会发现原来虚拟机就可以使用了

  • git使用,在ubuntu中

    #安装sudoaptinstallgit要先到github官网建一个账号。复制 #配置你的github gitconfig--globaluser.name"fanbrightup"//即是你在github中的用户名 gitconfig--globaluser.email"fanbright@126.com"复制 (可以先跳过这两步,现在用不到)复制  查看配置信息  gitconfig--list 编辑配置信息  gedit~/.gitconfig复制 #创建公钥 ssh-keygen-C'fanbright@126.com'-trsa会让你选择一些位置,在提示信息时直接回车就好了,覆盖掉原来的,回车三次吧复制   这会在用户目录 ~/.ssh/ 下建立相应的密钥文件#上传公钥 在 github.com 的界面中选择右上角头像旁向下的箭头的Settings,然后选择 SSHandGPGkeys,选择新加。 Title 可以随便命名(我的为ubuntu16.04),Key 的内容拷贝自 ~/.s

  • 使用简单图片

         前面的Android应用中已经大量使用了简单图片,图片不仅可以使用ImageView来显示,也可作为Butto、Window的背景。从广义的角度来看,Android应用中的图片不仅包括*.png、*.jpg、*.gif等各种格式的位图,也包括使用XML资源定义的各种Drawable对象。      使用Drawable对象        为Android应用增加了Drawable资源之后,AndroidSDK会为这份资源在R清单文件中创建一个索引项:R.drawable.file_name。        接下来既可在XML资源文件中通过@drawable/file_name来访问该Drawable对象,也可在Java代码中通过R.drawable.file_name来访问该Drawable对象。    &nb

  • HDU 5988 最小费用流

    链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5988 题意: n个点,每个点有a个人和b包饭,m条边,第一次经过这条边没有问题,以后每一个经过的有p概率出问题 每条边有限制,问使得所有人都有饭吃且出问题的概率最小 题解: 无向图的费用流 把相乘的取下对数变成相加的就可以用最小费用流了 代码: 30#include<iomanip> 31constdoubleeps=1e-8; 32constintMAXM=1e5+7; 33 34structnode{ 35intto,next,cap; 36doublecost; 37}edge[MAXM]; 38inthead[MAXN]; 39intpre[MAXN]; 40intvis[MAXN]; 41doubledist[MAXN]; 42intn,m,tot; 43 44voidinit(){ 45memset(head,-1,sizeof(head)); 46tot=0; 47} 48 49voidadd_edge(intu,intv,intcap,doublec

  • 【设计模式】3.代理模式

    代理模式 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。 1.提高扩展性和复用性 2.保护目标对象 结构图:   Subject:RealSubject和Proxy的公共接口 RealSubject:Proxy代理的真实实体 Proxy:代理,与RealSubject实现同一接口,代理就可以代替真实实体。   Java中的代理技术:JDK、CGLIB、Javaassist、ASM Spring中常用JDK、CGLIB Mybatis中使用Javaassist   场景:假如软件的研发过程中,程序员不能直接与客户对接,必须由产品经理与客户进行对接,从而研发部门根据客户的需求进行相应研发工作。这里产品经理和程序员都是研发部门的员工,具有相同的职责(产品研发)。产品经理就代理了程序员的具体工作,可以采用代理模式。  例: 1.静态代理方式: publicinterfaceStaff{//Subject voidcreateWebAPP();//开发Web应用 voidcreateAndroidApp();//开发Andro

  • sig/slot

    2014-06-28星期六 18:44:51 开源的有libsigc++,简单代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160#include<algorithm>#include<iostream>#include<vector>#inclu

  • 数组

    //从52张牌中任意抽取四张publicclasstest{ publicstaticvoidmain(String[]args){ int[]deck=newint[52]; String[]suits={"黑桃","红桃","方块","梅花"}; String[]ranks={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; //初始化这张牌 for(inti=0;i<deck.length;i++){ deck[i]=i; } //任意洗牌 for(inti=0;i<deck.length;i++){ intindex=(int)(Math.random()*deck.length); inttemp=deck[index]; deck[i]=temp; deck[index]=deck[i]; } //随机抽取四张牌==洗完牌后抽取洗完后的最上面四张票 for(inti=0;i<4;i++){ Strings

  • IOS 本地通知推送消息

           在现在的移动设备中,好多应用性的APP都用到了推送服务,但是有好多推送的内容,比如有的只是单纯的进行推送一个闹钟类型的,起了提醒作 用,有的则是推送的实质性的内容,这就分为推送的内容来区别用什么推送,现有的推送有极光推送,友盟推送,个推,百度推送,APNS的苹果服务 器推送,目前我所了解的有这几种,可能还有很多的推送sdk,我还没接触过,不过我所了解过的开发人员,他们使用的极光推送居多,极光推送也比较简单, 下面来说下推送流程,我只说我对推送的理解和我项目中所用到的推送的我的具体做法。。      第一种 单纯的推送提醒功能,不做什么特定的推送服务   复制 复制  推送的步骤如下复制 1.创建UILocationNotification 2.设置处理通知的时间fireDate 3.配置通知的内容:通知主体、通知声音、图标文字等 4.配置通知传递的自定义数据(可选) 5.调用通知复制       如果项目中单纯用的推送是为了提醒作用完全可以只用一个通知来处理就可以,注册通知的方法需要在appdelegate里面进行设置,具体代

  • 记一次windows下物理迁移数据库的过程

    背景:     最近因为一次设备故障,导致一台运行windows环境下的机器无法启动,里面有一个正在使用的财务数据库,该数据库也只是每月使用一次,需要把物理数据迁移出来,于是拔出了故障机器的硬盘,通过一个专门的硬盘接口器读取了数据的数据库数据来做物理迁移。   把物理数据库拷入新机器,以下所有操作都在新机器上进行。   1.拷入spfile和数据文件到对应的目录   把spfile拷入$ORACLE_HOME/dbs下  把数据库物理文件拷入$ORACLE_BASE/oradata下  在$ORACLE_BASE/admin/下创建adumpbdumpcdumpudump文件下   2.登录sqlpus报ora-12560错误 C:\Windows\system32>setORACLE_SID=ZDJS C:\Windows\system32>echo%ORACLE_SID% ZDJS C:\Windows\system32>

  • hello world

    haveatest 转载请注明出处https://www.cnblogs.com/bamboosings/

  • 洛谷P1443马的遍历

    #include<cstdio> #include<string.h> #include<cmath> #include<queue> usingnamespacestd; structxy{ intx,y; }node,Top; constintdx[4]={1,-1,2,-2}; constintdy[4]={1,-1,2,-2};//虽说一共16个方向但是在程序中有具体判断 inta[401][401]; boolb[401][401]; intn,m; voidbfs(intx,inty,intstep){ a[x][y]=step; b[x][y]=false; queue<xy>Q;//构建队列 node.x=x; node.y=y; Q.push(node);//起始点入队 while(!Q.empty()){ Top=Q.front();//取出队首点 Q.pop();//队首点出队 for(inti=0;i<4;i++) for(intj=0;j<4;j++) if(abs(dx[i])!=abs

  • 利用ovito来计算MSD

    1.pythonscript: importnumpy defmodify(frame,data):#Accesstheper-particledisplacementmagnitudescomputedbythe#'DisplacementVectors'modifierprecedingthisuser-definedmodifierinthe#datapipeline:displacement_magnitudes=data.particles['DisplacementMagnitude'] #ComputeMSD:msd=numpy.sum(displacement_magnitudes**2)/len(displacement_magnitudes) #OutputvalueasaglobalattributetomakeitavailablewithinOVITO:data.attributes["MSD"]=msd   2.ovito中的操作 (1)打开unwraptrajectories ,目的是不考虑周期性原子,计算会才会准。 (2)打开以下的功

  • 项目实际应用中redis缓存与数据库一致性问题解决

    一、 需求起因 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cache中是旧数据,数据不一致【如下图:db中是新数据,cache中是旧数据】。       假设先淘汰缓存,再写数据库:第一步淘汰缓存成功,第二步写数据库失败【如下图:cache中无数据,db中是旧数据】。         结论:先淘汰缓存,再写数据库。 二、 数据不一致原因 先操作缓存,在写数据库成功之前,如果有读请求发生,可能导致旧数据入缓存,引发数据不一致。 写流程: (1)先淘汰cache (2)再写db 读流程: (1)先读cache,如果数据命中hit则返回 (2)如果数据未命中miss则读db (3)将db中读取出来的数据入缓存 什么情况下可能出现缓存和数据库中数据不一致呢?       在分布式环境下,数据的读写都是并发的,上游有多个应用,通过一个服务的多个部署(为了保证可用性,一定是部署多份的),对同一个数据进行读写,在数据库层面并发的

相关推荐

推荐阅读