我有chec是客户端对象存在的方法(按名称)并返回其位置:
int Program::checkClient(string userName){
vector<Client> *ptr = &(impl->clients);
int i;
for (i = 0; i < ptr->size(); i++){
if(ptr->at(i).getName() == userName){
return i;
}
}
return -1;
}
问题在于我收到警告,因为i < ptr->size()
。我相信我需要使用迭代器。但是如何正确地做到这一点,因为我不仅需要运行循环,还要返回int作为结果,找到它的位置。有任何想法吗?我尝试过做这样的事,但没有运气:
int Program::checkClient(string userName){
vector<Client> *ptr = &(impl->clients);
vector<Client>::iterator it;
for (it.ptr->begin(); it < it.ptr->end(); it++){
if(ptr->at(it).getName() == userName){
return it;
}
}
return -1;
}
我在类似的地方收到错误:it.ptr->begin()
。
答案 0 :(得分:0)
您不需要使用迭代器;你还没有提到你得到了什么警告,但这可能是因为你将int
与vector<Client>::size_type
进行了比较,这很可能是一种无符号类型。将i
的声明更改为
std::vector<Client>::size_type i;
现在,您的迭代器代码中出现错误,因为它的语法不正确。 for循环应该如下所示:
for(it = ptr->begin(), it != ptr->end(); ++it) { ... }
您可以使用std::distance
return std::distance(ptr->begin(), it);
此外,正如上面的评论中所提到的,最好使用std::find_if
,特别是如果你有一个支持lambda表达式的编译器。
auto it = std::find_if(impl->clients.begin(),
impl->clients.end(),
[&]( Client const& c ) {
return c.getName() == userName;
} );
return (it != impl->clients.end()) ?
std::distance(impl->clients.begin(), it) : -1;
答案 1 :(得分:0)
使用此:
int Program::checkClient(string userName)
{
vector<Client> * ptr = &(impl->clients);
vector<Client>::iterator it;
int count=0; //for counting the position
for (it=ptr->begin(); it!=ptr->end(); ++it)
{
++count;
if( (*it).getName() == userName )
{
return count;
}
}
return -1;
}
答案 2 :(得分:0)
对于搜索/查找我更喜欢使用while
,它更容易理解
您宁可使用const&
作为方法参数。
所以它会给出类似的东西:
int Program::checkClient(string const& userName) const
{
vector<Client> const& clients = impl->clients;
vector<Client>::const_iterator it = clients.begin();
while (it != clients.end() && it->getName() != userName)
++it;
return it != clients.end() ? it - clients.begin() : -1;
}