练习 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) /* ... */