0

我有方法检查客户端对象是否存在(按其名称)并返回其位置:

   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().

4

3 回答 3

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;
}
于 2013-11-13T18:57:29.703 回答
0

您不需要使用迭代器;你没有提到你得到什么警告,但这可能是因为你正在比较一个intto 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;
于 2013-11-13T18:37:29.650 回答
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;
}
于 2013-11-13T18:42:19.623 回答