[英]How to access the position of an object within a vector when using an iterator?
[英]How to use iterator for finding position of object in vector?
我有哪个方法是客户端对象存在(按其名称)并返回其位置:
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值。 有任何想法吗? 我试图做这样的事情,但没有运气:
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()
。
您不需要使用迭代器。 您没有提到收到的警告,但这可能是因为您正在将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;
用这个:
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;
}
对于搜索/查找,我更喜欢使用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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.