用迭代器做参数,指定查寻范围,查找范围能否包含后一个迭代器所指元素
用迭代器做参数,指定查找范围,查找范围能否包含后一个迭代器所指元素。
//返回指定范围中的最大元素的迭代器
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()。
------解决思路----------------------
为什么一定要包含last,需要搜索[first,last]的范围的话,传递first,++last不就好了
------解决思路----------------------
你的需求包含两个互相矛盾的假设:
1. last 不能包含有效范围的下一个元素 (last 可以解引用)
2. last 可以包含有效范围的下一个元素 (last 可以是 end() )
所以你应该修改你的函数接口,明确 last 的含义。
------解决思路----------------------
我的意思是,不把last包含在搜索范围内就好了。
如果要搜索整个列表,那么传递(begin, end)
如果要搜索第a到第b个元素,那么传递(begin+a-1, begin+b)
如果要搜索第c到最后一个元素,那么传递(begin+c-1, end)
不就行了,为什么一定要让last包含在搜索范围里呢
//返回指定范围中的最大元素的迭代器
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()。
------解决思路----------------------
为什么一定要包含last,需要搜索[first,last]的范围的话,传递first,++last不就好了
------解决思路----------------------
你的需求包含两个互相矛盾的假设:
1. last 不能包含有效范围的下一个元素 (last 可以解引用)
2. last 可以包含有效范围的下一个元素 (last 可以是 end() )
所以你应该修改你的函数接口,明确 last 的含义。
------解决思路----------------------
我的意思是,不把last包含在搜索范围内就好了。
如果要搜索整个列表,那么传递(begin, end)
如果要搜索第a到第b个元素,那么传递(begin+a-1, begin+b)
如果要搜索第c到最后一个元素,那么传递(begin+c-1, end)
不就行了,为什么一定要让last包含在搜索范围里呢