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

网站建设规划书结构唐山app开发公司

网站建设规划书结构,唐山app开发公司,视频类网站怎么做,wordpress 注册 中文版前言 之前的两篇文章我们主要了解了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/923519/

相关文章:

  • 网上购物网站建设wordpress本地nginx
  • 可以做动漫的网站河南企业建设网站
  • 室内设计作品集案例优化的含义是什么
  • 第三方做公司网站品牌画册设计公司
  • 单网页网站制作深圳网络推广案例
  • 哪些网站用python做的北关网站制作
  • 网站建设安全淘宝网店运营
  • 遵义市播州区建设厅网站网站根据城市做二级目录
  • 做网站是否需要自购服务器个人网站需要多大的网速
  • 东莞网站系统哪里好做爰的最好看的视频的网站
  • 本地网站建设官网什么平台可以发网推广
  • 餐饮公司加盟网站建设建什么类型网站好
  • 备案用的网站建设方案书哪个做公司网站
  • 金沙网站怎么做代理wordpress再见
  • 学做网站培训班要多少钱广州牌具做网站的公司
  • WordPress网站主题升级外贸公司网站多少钱
  • 惠州建设工程质量监督站网站没有域名装wordpress
  • 聊城网站建设优化厦门服装商城网站建设
  • 中国科技创新十大成果新郑整站优化
  • 成都网站设计策划免费如何查找网站死链
  • 网站更换空间后排名消失 首页被k网站建设图片像素是多大的
  • 网站域名批量查询什么网站做蔬菜生鲜比较好
  • 宿迁高端网站建设网站建设产业pest分析
  • 关于公司建网站网站怎么做内链外链
  • 东莞企业免费建站简述四个网络营销推广策略
  • 网站建设需要服务器淘宝店购买网站
  • 公司建站系统三亚网站建设费用
  • 做网站写代码怎么样网站服务商排名
  • 1 企业网站的一般内容是什么郑州企业网站建站模板
  • 公司如何建设网站首页scratch免费下载