c++ stl 容器 迭代器 stl用法示例

1.基本概念

1.1容器概述

  1. 顺序容器 vector, deque,list
  2. 关联容器 set, multiset, map, multimap
  3. 容器适配器 stack, queue, priority_queue

1.1.1迭代器

  1. 用于指向顺序容器和关联容器中的元素
  2. 迭代器用法和指针类似 有const 和非 const两种
  3. 通过迭代器可以读取它指向的元素
  4. 通过非const迭代器还能修改其指向的元素

1.1.2顺序容器:

容器并非排序的,元素的插入位置同元素的值无关。

1.1.3关联容器:

  1. 元素是排序的
  2. 插入任何元素,都按相应的排序规则来确定其位置
  3. 在查找时具有非常好的性能 通常以平衡二叉树方式实现,插入和检索的时间都是 O(log(N))
  4. 相互关系:map与set的不同在于map中存放的元素有且仅有两个成员变量,一个 名为first,另一个名为second, map根据first值对元素进行从小到大排序, 并可快速地根据first来检索元素

map同multimap的不同在于是否允许相同first值的元素
set 即集合。set中不允许相同元素,multiset中允许存在相同的元素。

1.1.4顺序容器和关联容器中都有的成员函数

  1. begin 返回指向容器中第一个元素的迭代器
  2. end 返回指向容器中最后一个元素后面的位置的迭代器
  3. rbegin 返回指向容器中最后一个元素的迭代器
  4. rend 返回指向容器中第一个元素前面的位置的迭代器
  5. erase 从容器中删除一个或几个元素
  6. clear 从容器中删除所有元素
  7. front :返回容器中第一个元素的引用
  8. back : 返回容器中最后一个元素的引用
  9. push_back : 在容器末尾增加新元素
  10. pop_back : 删除容器末尾的元素
  11. erase :删除迭代器指向的元素(可能会使该迭代器失效),或删 除一个区间,返回被删除元素后面的那个元素的迭代器

1.2为什么定义迭代器?

迭代器上可以执行 ++ 操作, 以使其指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,此时再使用它,就会出错,类似于使用NULL或未初始化的指针一样。

1.3怎么定义并使用迭代器?

定义一个容器类的迭代器的方法可以是:
容器类名::iterator 变量名;
或: 容器类名::const_iterator 变量名;
访问一个迭代器指向的元素: * 迭代器变量名

#include<iostream>
#include<vector>
using namespace std;
int main(){vector<int> t;for(int i=1;i<10;++i){t.push_back(i);} vector<int>::const_iterator i;for( i=t.begin();i!=t.end();++i){cout<<*i;//输出123456789 }
} 

1.4容器上的迭代器类别

  1. vector 随机访问
  2. deque 随机访问
  3. list 双向
  4. set/multiset 双向
  5. map/multimap 双向
  6. stack 不支持迭代器
  7. queue 不支持迭代器
  8. priority_queue 不支持迭代器

不同类别有区别?

1.4.1双向迭代器

若p和p1都是双向迭代器,则可对p、p1可进行以下操作:

  1. ++p, p++ 使p指向容器中下一个元素
  2. –p, p-- 使p指向容器中上一个元素
  3. *p 取p指向的元素
  4. p == p1 , p!= p1 判断是否相等、不等(list的一种遍历方法)

1.4.2随机访问迭代器

若p和p1都是随机访问迭代器,则可对p、p1可进行以下操作:

双向迭代器的所有操作

  1. p += i 将p向后移动i个元素
  2. p -= i 将p向向前移动i个元素
  3. p + i 值为: 指向 p 后面的第i个元素的迭代器
  4. p - i 值为: 指向 p 前面的第i个元素的迭代器
  5. p[i] 值为:p后面的第i个元素的引用
  6. p < p1, p <= p1, p > p1, p>= p1 (多种遍历方法!!)
  7. p – p1 : p1和p之间的元素个数

2.stl用法

stl有什么用?
有了STL,不必再写大多的标准数据结构和算法,并且可获得非常高的性能。

  1. STL中提供能在各种容器中通用的算法,比如查找,排序等
  2. 算法通过迭代器来操纵容器中的元素。许多算法可以对容器中的一个 局部区间进行操作,因此需要两个参数,一个是起始元素的迭代器, 一个是终止元素的后面一个元素的迭代器。比如,排序和查找
  3. 有的算法返回一个迭代器。比如 find() 算法,在容器中查找一个元素, 并返回一个指向该元素的迭代器

2.1算法示例:find()

template< class InIt, class T>
InIt find(InIt first, InIt last, const T& val);
find在[first,last)查找等于val的元素
用 == 运算符判断相等
函数返回值是一个迭代器。如果找到,则该迭代器指向被找到的元素。 如果找不到,则该迭代器等于last

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){int array[101],a;vector<int> v;vector<int>::iterator p;cin>>a;for(int i=0;i<a;++i){cin>>array[i];} int *pp=find(array,array+a,20);if(pp!=array+a)cout<<*pp<<endl;else cout<<"not found"<<endl;for(int i=0;i<a;++i){v.push_back(array[i]);}p=find(v.begin(),v.end(),20);if(p!=v.end())cout<<*p<<endl;else cout<<"not found"<<endl;
} 

用数组都能写啊,何必用容器呢?
当你想要从某个位置插入或删除一个数的时候,用数组就很麻烦,但是用vector就很方便了,而且他是可变长的,那也就不用考虑越界的问题了。

2.2 vector用法实例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
template<class T>
void printvector(T s,T e){for(; s!=e ;++s)cout<<*s<<" ";cout<<endl;
}
int main(){vector<int>::iterator p;int a[101],n,b;cin>>n;for(int i=0;i<n;++i){cin>>a[i]; }vector<int> v(a,a+n);cout<<v.end()-v.begin()<<endl;//1.求容器里有多少个数 v.insert(v.begin()+2,100);//2.在v.begin()+2这个位置插入一个数 printvector(v.begin(),v.end());v.erase(v.begin()+2);//3.删除v.begin()+2这个位置的数 printvector(v.begin(),v.end());vector<int>v2(5,1000);//4.建立一个由五个1000组成的容器 printvector(v2.begin(),v2.end());v2.insert(v2.begin(),v.begin()+1,v.begin()+3);//5.将v.begin()+1到v.begin()+3的数插入到v2.begin()这个位置上 // 输出时输出所有v2,只不过开头增加了一段数。 printvector(v2.begin(),v2.end());v.erase(v.begin() + 1, v.begin() + 3); //6.删除一段区间 printvector(v.begin(),v.end());} 
//输入: 
//5
//1 2 3 4 5//输出: 
//5
//1 2 100 3 4 5
//1 2 3 4 5
//1000 1000 1000 1000 1000
//2 3 1000 1000 1000 1000 1000
//1 4 5

所有适用于 vector的操作都适用于 deque。
deque还有 push_front(将元素插入到前面) 和 pop_front(删除最前面的元素)操作,复杂度是O(1)

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

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

相关文章

python julian date_Python 的内嵌time模板翻译及说明

一、简介time模块提供各种操作时间的函数 说明&#xff1a;一般有两种表示时间的方式: 第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的 第二种以数组的形式表示即(struct_time),共有九个元素&#xff0c;分别表示&#xff0c;同一个时间戳的st…

html玫瑰花效果代码,html5渲染3D玫瑰花情人节礼物js特效代码

情人节马上就要到来了&#xff0c;这里给程序员前端设计师们献上一个&#xff0c;html5渲染而成的3D玫瑰花js效果&#xff0c;可以作为虚拟的情人节礼物送给自己的爱人。支持html5的浏览器查看。查看演示下载资源&#xff1a;16次 下载资源下载积分&#xff1a;20积分情人节玫瑰…

跳跃游戏(数组下标跳跃)

给定一个非负整数数组&#xff0c;假定你的初始位置为数组第一个下标。 数组中的每个元素代表你在那个位置能够跳跃的最大长度。 请确认你是否能够跳跃到数组的最后一个下标。 例如&#xff1a;A [2,3,1,1,4]A[2,3,1,1,4] 能够跳跃到最后一个下标&#xff0c;输出true&…

qc中的流程图怎么画_QC流程图参考

华北工控股份有限公司QC流程图样件试产量产文件编号:WI-MED-000FIC-G009版本:A0修改日期:客户:常规品机种:pcba适用工序&#xff1a;IQC/SMT/DIP/OQC/TEST/PACK审核:批准&#xff1a;检验方法检验频率记录担当负责人在制品完成品11确认型号、数量依送货单核对型号/数量仓库检查…

html 页面怎么加载富文本,UILabel加载html富文本

本文主要解决html标签之外文本属性设置当APP里面有搜索的需求的时候&#xff0c;产品可能会要求关键字显示特殊颜色或者字体。其中一种可能性是服务器返回的数据是带有html标签的字符串&#xff0c;那么该怎么解决&#xff1f;当标签之外的其他字体也需要设置不同格式&#xff…

python 打印皮卡丘_用python打印你的宠物小精灵吧

我们来通过一个有趣的例子开始编写我们的第一个python代码。本文涉及的python基础语法为&#xff1a;print输出函数&#xff0c;赋值&#xff0c;字符串print()print()是python的一个内置函数&#xff0c;用于打印输出&#xff0c;是最常见的一个函数之一。有些朋友可能对于打印…

最大子阵列

在一个数组中找出和最大的连续几个数。&#xff08;至少包含一个数&#xff09; 例如&#xff1a; 数组A[] [−2, 1, −3, 4, −1, 2, 1, −5, 4]&#xff0c;则连续的子序列[4,−1,2,1]有最大的和6. 输入格式 第一行输入一个不超过1000的整数n。 第二行输入n个整数A[i]。…

html嵌入原始数据,如何用html和javascript显示原始图像数据?

我有一个ajax应用程序,PHP端将来自摄像头的未编码的原始图像数据发送到客户端javascript端.我想使用img或canvas标签通过html和javascript显示图像.图像数据是32 * 32无符号字符.我想做,无论达到我的目标(编码或其他所有),但我想在客户端做,因为我无法处理服务器端的任何其他操…

三值排序

排序是一种很频繁的计算任务。一个实际的例子是&#xff0c;当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1&#xff0c;2和3。我们用交换的方法把他排成升序的。 写一个程序计算出&#xff0c;计算出的一个包括1、2、3三种值的数字序列&#…

imgaug批量椒盐噪声 python_python图像扩增-imgaug

# encodingutf-8import osimport imageioimport randomimport numpy as npimport imgaug as iaimport concurrent.futuresfrom imgaug import augmenters as iaaimport matplotlib.pyplot as pltfrom argparse import ArgumentParseria.seed(4)# %matplotlib inline# 参考 http…

express html文件接收路由参数,express 获取post 请求参数

在 Express 中没有内置获取表单 POST 请求体的 API , 我们需要添加第三方插件库安装:npm install --save body-parser配置:var bodyParser require(body-parser)//配置 body-parser 中间件 (插件, 专门用来解析表单 POST 请求)// parse application/x-www-form-urlencodedapp.…

深度优先搜索重要模板

深度优先搜索(Depth-First-Search) 从起点出发&#xff0c;走过的点要做标记&#xff0c;发现有没走过的点&#xff0c;就随意挑一个往前走&#xff0c;走不 了就回退&#xff0c;此种路径搜索策略就称为“深度优先搜索”&#xff0c;简称“深搜”。 其实称为“远度优先搜索”…

360浏览器查看html文件在哪里,360浏览器8菜单栏怎么弄出来?如何查看网站源代码...

今天想查看一个页面的源代码&#xff0c;没想到这个页面竟然禁止了鼠标右键功能&#xff0c;所以无法通过鼠标右键选择“查看源代码”来查看。然后就想通过 360 浏览器的“查看源代码”按钮进行查看&#xff0c;没想到找了半天都找不到这个按钮&#xff0c;最后只能通过查看源代…

tcp欢动窗口机制_TCP协议中的窗口机制------滑动窗口详解

一、窗口机制的分类在TCP协议当中窗口机制分为两种&#xff1a;1.固定的窗口大小2.滑动窗口二、固定窗口存在的问题如下图所示&#xff1a;我们假设这个固定窗口的大小为1&#xff0c;也就是每次只能发送一个数据&#xff0c;只有接收方对这个数据进行了确认后才能发送第二个数…

1-1.HTML、CSS、JavaScript语言在web前端开发中的作用

HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息&#xff0c;可以包含文字、图片、视频等。 CSS样式是表现。 就像网页的外衣。比如&#xff0c;标题字体、颜色变化&#xff0c;或为标题加入背景图片、边框等。所有这些用来改变内容外观的东西称之为…

判断html()中有长度,VBS 字符串长度判断的问题

对于给你一个字符串你应该怎样判断他的字符串长度&#xff0c;试举一些典型的例子C语言——字符串长度的计算方法提示&#xff1a;(1)计算字符串长度时关键是要注意辨认转义字符&#xff1b;(2)一个转义字符总是以反斜杠开始&#xff0c;再加一个其他字符组成。所以&#xff0c…

maxvalue mysql自动分区_创建mysql表分区的方法

创建mysql表分区的方法我来给大家介绍一下mysql表分区创建与使用吧&#xff0c;希望对各位同学会有所帮助。表分区的测试使用&#xff0c;主要内容来自于其他博客文章以及mysql5.1的参考手册。表分区是最近才知道的哦&#xff0c;以前自己做都是分表来实现上亿级别的数据了&…

html概述

什么是html&#xff1f; HTML&#xff08;Hyper Text Markup Language&#xff09;超文本标记语言。 标记语言就是让文本展示更丰富&#xff0c;更美观的一种语言。比如说文本加粗 更换颜色 斜体 html这种标记语言就是为了让网页展示更丰富&#xff0c;更美观的一种语言 开发…

计算机专业后悔么,王言匀

《中华独特疗法大成》分方法和治疗两篇。方法篇依据用药与否&#xff0c;分为药物疗法和非药物疗法两章&#xff0c;药物疗法按照给药途径分为内服法和外用法两节&#xff1b;非药物疗法根据施术手段分为针灸、推拿、气功及其他4节。这些章节介绍了273种治疗方法的基本内容、适…

python制作网页样式与布局_Python开发【第十二篇】:CSS装饰页面

CSS称为层叠样式表&#xff0c;是Cascading Style Sheets的缩写。CSS不仅可以静态地修饰网页&#xff0c;还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS引入方式&#xff1a;行内式&#xff1a;对标签元素添加style属性&#xff0c;在style属性中设置CSS样式&#…