【发布时间】:2017-09-11 15:59:40
【问题描述】:
我定义了向量:
std::vector<int> Numbers;
另外,我定义了一个迭代器,并将其初始化到向量的开头:
std::vector<int>::iterator numIt=Numbers.begin();
我使用该迭代器通过 for 循环传递向量:
for(; numIt!=Numbers.end(); ++numIt) {
if(func(Numbers,numIt)==true){
return SUCCESS;
}
}
...func 是以下函数:
bool func(std::vector<int> Numbers.end, std::vector<int>::iterator curElement){
std::vector<int>::iterator nextElement=curElement;
++nextElement;
if(nextElement== Numbers.end()){
return false;
}
int ICurElement=*curElement;
int InextElement=*nextElement;
return ICurElement>InextElement ? true : false;
}
为什么我在func 中从来没有进入过if?。
完整代码
bool CurGreaterNext(std::vector<int>& set,std::vector<int>::iterator& curElement ,int size){
std::vector<int>::iterator nextElement=curElement;
if(size == 1){
return false;
}
++nextElement;
if(nextElement==set.end()){
std::cout<< " im hereee "<<std::endl;
}
int ICurElement=*curElement;
int InextElement=*nextElement;
return ICurElement>InextElement ? true : false;
}
template<class TheSet , class Predicate >
void funkiFun(TheSet set , Predicate func){
typename TheSet::iterator end=set.end();
int count=0;
for(typename TheSet::iterator it = set.begin(); it != end ; it++){
if(func(set,it,set.size()-count)==true){
std::cout << "Wo-Ho the number is "<< *it << std::endl;
break;
}
count++;
}
std::cout << std::endl;
};
主要
int main{
int a1 = 1;
int a2 = 2;
int a3 = 3;
int a4 = 4;
int a5 = 5;
std::vector<int> Numbers;
Numbers.push_back(a1 );
Numbers.push_back(a2 );
Numbers.push_back(a3 );
Numbers.push_back(a4 );
Numbers.push_back(a5 );
funkiFun<std::vector<int> >(numbers5,CurGreaterNext);
}
【问题讨论】:
-
for(; numIt!=set.end();++ numIt) 在这一行中设置了什么?请发布您的完整代码
-
因为你是通过副本传递向量,所以参数的结束迭代器永远不会匹配原始向量的迭代器(你的
curElement,或nextElement)。您想通过 const-reference 传递set,例如auto func(std::vector<int> const& set, std::vector<int>::iterator curElement) { ... }). -
你的向量是空的,所以
begin() == end()你永远不会进入循环。 -
@Holt ,我认为这是问题所在,但我在网站(cpprefrence)中读到 c++ 的迭代器指向元素,这并不意味着迭代器是一个指针?
-
@Quentin 我用向量检查了函数
={1,2,3,4,5}