簡體   English   中英

如何使用迭代器查找對象在矢量中的位置?

[英]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()

您不需要使用迭代器。 您沒有提到收到的警告,但這可能是因為您正在將intvector<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM