C++ 迭代器相关知识小结

疫情所迫,希望用这种方法督促自己坚持学习。同时记录在找工作过程中的艰辛不易。博客内容持续增减修改,都为摘录和个人理解。欢迎各位批评指正其中错误,相互勉励,共同进步。

一、迭代器简介

在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;
}
发布了27 篇原创文章 · 获赞 4 · 访问量 4520

猜你喜欢

转载自blog.csdn.net/SGL_LGS/article/details/104615796