用迭代器做参数,指定查找范围,查找范围能否包含后一个迭代器所指元素。

C++语言 码拜 9年前 (2015-10-21) 1017次浏览
//返回指定范围中的最大元素的迭代器

template<typename T>

typename list<T>::iterator maxIter(typename list<T>::iterator first,

typename list<T>::iterator last)

{

list<T>::iterator maxIter;

maxIter=first;//将maxIter设定为最大值的迭代器

if(first==last)  //假定只有一个元素,则直接返回

return maxIter;

while(first!=last)

{

if(*maxIter<*first)

maxIter=first;

first++;

//假如加下面这几行代码,last不能等于表的end()。若不加,则不能查找last本身所指向的元素

if(first==last) 

if(*maxIter<*last)

maxIter=last;

}

return maxIter;

}

int main()

{

int intArr[]={3,6,1,15,13,45,32,56,78};

int intSize=sizeof(intArr)/sizeof(int);

list<int> intList(intArr,intArr+intSize);

list<int>::iterator iter=intList.begin(),iter1=intList.end();

iter=maxIter<int>(iter,iter1);  //调用函数

cout<<*iter<<endl;

return 0;

}

正像本人在程序中注释中说的那样,假如加下面这几行代码,last不能等于表的end(),因end()不能做*反引用运算。

。若不这几行代码,则不能查找last本身所指向的元素

if(first==last) 

if(*maxIter<*last)

maxIter=last;

怎么解决这个问题,用怎么的代码可在迭代器(first,last)指定的范围内查找包括last自身在内的范围,又可让last等于end()。

解决方案:12分
为什么一定要包含last,需要搜索[first,last]的范围的话,传递first,++last不就好了
解决方案:13分
你的需求包含两个互相矛盾的假设:

1. last 不能包含有效范围的下一个元素 (last 可以解引用)

2. last 可以包含有效范围的下一个元素 (last 可以是 end() )
所以你应该修改你的函数接口,明确 last 的含义。

解决方案:15分

本人的意思是,不把last包含在搜索范围内就好了。

假如要搜索整个列表,那么传递(begin, end)

假如要搜索第a到第b个元素,那么传递(begin+a-1, begin+b)

假如要搜索第c到最后一个元素,那么传递(begin+c-1, end)

不就行了,为什么一定要让last包含在搜索范围里呢


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明用迭代器做参数,指定查找范围,查找范围能否包含后一个迭代器所指元素。
喜欢 (0)
[1034331897@qq.com]
分享 (0)