第九章 9.2.1节练习

练习 9.3:

构成迭代器范围的迭代器有何限制?

解答:

①这里首先要清楚什么是迭代器范围

【引用】一个迭代器范围(iterator range)由一对迭代器表示,两个迭代器分别指向同一个容器中的元素或者是尾元素之后的位置(one past the last element)。

②再去探讨限制

【引用】对构成范围迭代器的要求:

【引用】如果满足一下条件,两个迭代器begin和end构成一个迭代器范围:

【引用】· 他们指向同一容器中的元素,或者是容器最后一个元素之后的位置

【引用】· 我们可以通过反复递增begin来达到end。换句话说,end不在begin之前。


练习9.4:

编写函数,接受一对指向vector<int>的迭代器和一个int值。在两个迭代器指定的范围中查找给定的值,返回一个布尔值来指出是否找到。

解答:

其实在algorlthm标准头文件中,有一个find()函数,就可以完成这个功能。

#include <vector>
#include <iostream>

using namespace std;

bool myFind(vector<int>& vec, int num){
	vector<int>::iterator iter;
	bool flag = false;
	for (iter = vec.begin(); iter != vec.end(); iter++){
		if (num == *iter){
			flag = true;
			break;
		}
	}
	return flag;
}

int main() {
	vector<int> a{1,2,3,4,5,6,6,7,8,8,9,9};
	cout << myFind(a, 6) <<endl;
	cout << myFind(a, 10) <<endl;
}


练习 9.5 :

重写上一题的函数,返回一个迭代器执指向找到的元素。注意,程序必须处理未找到给定值的情况。

解答:

#include <vector>
#include <iostream>

using namespace std;

auto myFind(vector<int>& vec, int num) -> vector<int>::iterator{
	vector<int>::iterator iter;
	bool flag = false;
	for (iter = vec.begin(); iter != vec.end(); iter++){
		if (num == *iter){
			return iter;
		}
	}
	return vec.end() - 1; // 当没有找到时,返回指向容器中最后一个元素的指针
}

int main() {
	vector<int> a{1,2,3,4,5,6,6,7,8,8,9,9};
	cout << *myFind(a, 6) <<endl;
	cout << *myFind(a, 10) <<endl; 
}

练习9.6:

下面程序有何错误?你应该如何修改它?

list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),
					iter2 = lst1.end();
while(iter1 < iter2) /* ... */

解答:

迭代器之间没有办法比较大小。迭代器有减法操作,但是只适用于连续存储的对象,比如vector、数组。

这里使用的是list,所以在存储空间上不一定连续。

同样在标准库中,list的迭代器也不支持相减的操作。

这里,就直接比较两个list迭代器指向的值吧(比较简单的情况)

list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),
					iter2 = lst1.end();
while(*iter1 < *iter2) /* ... */


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值