当前位置: 首页 > news >正文

海珠网站建设报价国土系统网站建设用地受理表

海珠网站建设报价,国土系统网站建设用地受理表,论文收录网站排名,医院网站改版建设方案前言 之前的两篇文章我们主要了解了vector和string的相关知识,从中我们知道可以通过下标来访问vector的元素或者string的字符,但是除了这种方式还有一种更为通用的方式获取元素,那就是迭代器,这篇文章就会简单介绍迭代器的相关内…

前言

之前的两篇文章我们主要了解了vector和string的相关知识,从中我们知道可以通过下标来访问vector的元素或者string的字符,但是除了这种方式还有一种更为通用的方式获取元素,那就是迭代器,这篇文章就会简单介绍迭代器的相关内容。

迭代器简介

在我们使用容器去存储元素的时候有时候会需要获取存储的元素,而迭代器就是用于从容器中获取元素的,基本上所有容器的库都支持迭代器,但是只有其中一小部分支持下标获取元素的。虽然string不是容器但是其支持很多容器的操作,其中就包括下标和迭代器。

与指针类似,迭代器提供了一种间接获取对象的方式,对于迭代器而言,这个对象就是容器中的元素或者string中的字符,我们可以通过迭代器获取一个元素,与此同时也可以将指向的对象从一个对象移到下一个对象。迭代器还和指针一样有有效和无效之分,所有代表容器中元素或最后一个元素的下一个位置都是有效的,其他所有的迭代器都是无效的。

迭代器的使用

不像指针,我们不使用地址操作符去获取一个迭代器,每一个支持迭代器的类型都有函数可以返回迭代器,这些类型都有名为begin和end的函数,begin返回的是代表第一个元素的迭代器,end的返回的迭代器是容器或者字符串的最后一个元素的下一个位置,这个迭代器代表着最后一个元素的下一个位置,是一个不存在的元素。如果容器为空,则begin和end返回的是同一个迭代器。

auto b = v.begin(), e = v.end()

迭代器的操作

迭代器只支持下表列出来的操作,我们可以通过==或!=比较两个有效的迭代器,如果迭代器代表着同一个元素或者都是最后一个元素的下一个位置则相等,否则它们不等。
|操作|解释|
|*iter|返回迭代器代表的指针指向的值|
|iter->mem|等价于(*iter).mem|
|++iter|指向容器中的下一个元素|
|–iter|指向容器中的前一个元素|
|iter1 == iter2|判断两个迭代器是否相等|
|iter1 != iter2|判断两个迭代器是否不等|

对于指针,我们可以使用解引用符获取一个迭代器的元素,和指针相同,我们只能通过解引用符获取一个有效的迭代器的元素,如果解引用一个最后一个元素之后的迭代器结果是未知的。

# include<iostream>
# include<string>
using namespace std;int main() {string s("some string");if (s.begin() != s.end()) {auto it = s.begin();*it = toupper(*it);}cout<<s<<endl;}

上述的例子就是通过迭代器获取字符串s的首个字符并将其大写。

迭代器从一个元素移动到另一个元素

迭代器私用自增操作符从一个元素移动到该元素的下一个元素,自增一个迭代器与自增一个整型十分类似,对于整型而言,自增的是其本身的值,对于迭代器而言,其影响是往前进一个位置。

由于end返回的不是一个元素,所以其不能自增或者解引用

使用自增操作我们可以重写之前的程序:

# include<iostream>
# include<string>
using namespace std;int main() {string s("some string");for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it) {*it = toupper(*it);}cout<<s<<endl;}

如上例所示,我们通过迭代器可以实现循环遍历。

迭代器的类型

正如我们并不准确知道vector的准确类型或者string的size,同样的,我们也不知道同时也不需要知道迭代器的准确类型,但是根据迭代器的读写权限定义了以下几种迭代器的类型:

 vector<int>::iterator it; //it可以读也可以写vector<int>的元素string::iterator it2; //it2可以读写字符串里的字符vector<int>::const_iterator it3; //it3可以读但是不可以写元素string::const_iterator it4; //it4可以读但是不可以写字符串里面的字符

const_iterator表现就像是常量指针,可以读取元素但是不能写元素

begin和end操作

begin和end返回的结果取决于它们操作的对象是不是常量,如果操作对象是常量,那么begin和end返回的就是const_iterator,如果对象不是常量,那么返回的就是iterator。

# include<iostream>
# include<string>
# include<vector>
using namespace std;int main() {
vector<int> v;
const vector<int> cv;
auto it1 = v.begin(); //it返回的是vector<int>::iterator
auto it2 = v.begin(); //it返回的是vector<int>::const_iterator
}

这种默认的返回策略有时候并不满足需求,在一些情况下一些非常量的vector我们只想读取元素,避免元素被更改,在C++11中提供了以下新的方法cbegin和cend,无论vetor是不是常量都返回const_iterator。

auto it3 = v.cbegin();

迭代器的数学运算

处理之前提到自增和自减外,迭代器还支持以下数学运算,虽然迭代器是没有下标的概念的,但是一下运算都可以理解为是对于下标的操作,如加减就是自增和自减的普通形式,就是向前移动或者向后移动,大小比较就是前后位置的比较。

操作解释
iter + n同一个容器向前移动n
iter - n同一个容器向后移动
iter1 += n将移动结果赋值给iter1
iter1 -= n将移动结果赋值给iter1
>, >=, <, <=相对位置的比较

这么说起来可能又带你抽象,下面用一个二分法来说明:

# include<iostream>
# include<string>
# include<vector>
using namespace std;int main() {vector<int> v = {1, 2, 3, 4, 5};auto beg = v.begin(), end = v.end();auto mid = v.begin() + (end - beg) / 2;int target = 2;while (mid != end && *mid != target){if (target < *mid) {end = mid;} else{beg = mid;}mid = beg + (end - beg) / 2;}cout<<to_string(*mid)<<endl;}

以上例子会打印2,也就是元素2的位置。

最后

这篇文章主要介绍了C++中的迭代器,更多文章可以关注公众号QStack。

http://www.yayakq.cn/news/302016/

相关文章:

  • 网站设计建设价格搜索引擎优化方法案例
  • 上海优化网站公司房地产微网站模板
  • 山东网站备案注意事项海南seo快速排名优化多少钱
  • 北京通州做网站南宁小程序定制开发公司
  • 珠海汽车网站建设花生壳怎么建设购物网站
  • 网站怎么做筛选功能的代码发布消息做任务的网站
  • 北京市建设部网站广州番禺属于哪个区
  • 免费博客网站网站建设活动
  • 淘宝客网站备案号做安居客网站需要什么浏览器
  • 怎么更改网站首页图片尺寸东莞网站建设的价格
  • 洛阳新光建站百度相册登录入口
  • 官方网站怎么制作做网站是学什么专业
  • 如何建立自己网站视频教程网站设计步骤及注意事项
  • 漳州微网站建设公司推荐wordpress 通用代码 网页
  • 如何创建属于个人网站武清网站开发tjniu
  • 适合个人网站的名称扬州专业外贸网站建设推广
  • 建设用地规划许可证去哪个网站查河南网站排名优化价格
  • 网站设计轮播图需要吗咨询类网站模板
  • 厦门网站建设电话个人网站也要备案吗
  • 网站建设包括什么wordpress 摘要调用
  • 漳州市住房建设局网站0基础学网站开发
  • 秦皇岛建设局网站WordPress百度快照图片
  • 濮阳手机网站建设中国做外贸网站有哪些问题
  • 网站添加百度地图标注wordpress关闭多版本
  • 最专业的网站建设组织珠海企业网站设计公司
  • 做外贸的网站看啥书装饰logo设计图片
  • 顶呱呱网站建设是外包的吗手机查看别人网站代码吗
  • 新网站网页收录企业网站建设代理加盟
  • 网站 推送辽宁建设工程信息网老网站
  • 网站网站开发人员犯法吗都江堰网站建设培训