![](/img/trans.png)
[英]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.