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()。
1. last 不能包含有效范围的下一个元素 (last 可以解引用)
2. last 可以包含有效范围的下一个元素 (last 可以是 end() )
所以你应该修改你的函数接口,明确 last 的含义。
本人的意思是,不把last包含在搜索范围内就好了。
假如要搜索整个列表,那么传递(begin, end)
假如要搜索第a到第b个元素,那么传递(begin+a-1, begin+b)
假如要搜索第c到最后一个元素,那么传递(begin+c-1, end)
不就行了,为什么一定要让last包含在搜索范围里呢