疫情所迫,希望用这种方法督促自己坚持学习。同时记录在找工作过程中的艰辛不易。博客内容持续增减修改,都为摘录和个人理解。欢迎各位批评指正其中错误,相互勉励,共同进步。
一、迭代器简介
在string和vector中可以利用基于范围的for语句或者下标提取查找对象中的字符或元素。类似于指针,C++定义了迭代器类型,也可用来实现对象的间接访问。
迭代器类型和定义
在string和vector中利用函数size()可以获得对象中元素的数量。类似于size()函数的返回类型:
string s;
string::size_type len = s.size();
auto len = s.size();
迭代器的类型可定义如下:
//能利用迭代器进行读写操作
string::iterator s1;
vector<int>::iterator s2;
//只能利用迭代器进行读操作
string::const_iterator s3;
vector<int>::const_iterator s4;
但为了表示方便,我们利用auto让编译器自动判断该变量的类型,定义如下:
auto start = s.begin(), end = s.end();
值得注意的是,end()指向最后一个元素的下一个元素。
二、迭代器常用运算符
以下列举迭代器常用的几个运算符
*iter //迭代器解引用
iter->example //解引用iter并获得example的成员,等价于(*iter).example
++iter //指向迭代器的下一个元素
--iter
iter1==iter2
iter1!=iter2
示例代码一:
代码功能:利用迭代器将小写字符替换成大写字符
注意:如果我们将idx的定义改成 string::const_iterator idx = s.begin();
//输出为WAS LIKELY TO CONSIDER AS NEGLIGIBLE.
string s = "Was likely to consider as negligible.";
if (s.begin()!=s.end()) {
string::iterator idx = s.begin();
// auto idx = s.begin();
for (; idx < s.end(); idx++) {
if (isalpha(*idx)) *idx = toupper(*idx);
}
cout << s << endl;
}
示例代码二:
代码功能:利用迭代器遍历字符串所有元素并输出
注意:此处就利用了常量型迭代器定义idx,因为只读不用改写
string s = "Was likely to consider as negligible.";
if (s.begin()!=s.end()) {
string::const_iterator idx = s.begin();
for (; idx < s.end(); idx++)
cout << *idx;
cout << endl;
}
C++还提供了begin()和end()的常量型表达式:
auto iter = s.cbegin();
auto iter1 = s.cend();
三、迭代器运算
以下列举常用的几个迭代器运算
iter + n //指向iter指向元素之后的第n个元素
iter - n //指向iter指向元素之前的第n个元素
iter += n //同iter + n
iter -= n //同iter - n
iter1 - iter2 //计算两个迭代器之间的距离
> , < , >=, <= //关系运算符,作比较
示例代码一:
代码功能 :利用二分法查找vector中是否含有元素target
#include<iostream>
#include<vector>
using namespace std;
void main()
{
vector<int> nums = { 0,1,2,3,4,5,6,7,8,9 };
int target = 8;
auto left = nums.begin(), right = nums.end();
auto mid = left + (right - left) / 2;
while (*mid != target) {
if (*mid > target) right = mid - 1;
if (*mid < target) left = mid + 1;
mid = left + (right - left) / 2;
}
cout << *mid << endl;
}