2011-07-24 79 views
0

我想要做的功能是返回發生在向量中發生的事件。但是我的返回值始終爲0,我確信有匹配。在向量中找到C++

下面是代碼:

int findInItemvector(vector<Item> vec, string name) 
{ 
    for(vector<Item>::iterator it = vec.begin(); it < vec.end(); it++) 
    { 
     if(it->getName() == name) 
     { 
      return it - vec.begin(); 
      break; 
     } 
     else 
     { 
      return 0; 
     } 

    } 
} 
+8

爲什麼不對自定義謂詞使用'std :: find_if'? –

回答

6

當你的第一個元素不匹配時,else分支執行return,這會使函數和循環的其餘部分不能執行。你想要的東西,如:

int findInItemvector(vector<Item> vec, string name) 
{ 
    for(vector<Item>::iterator it = vec.begin(); it < vec.end(); it++) 
    { 
     if(it->getName() == name) 
     { 
      return it - vec.begin(); 
     } 
    } 

    return 0; 
} 

然而,由於第一項,也可以匹配(在這種情況下it - vec.begin() == 0),我建議你使用其他安全值,如-1(這永遠是有效的向量索引) 。

+0

+1返回-1 –

+5

「未找到」問題的真正解決方案是使用迭代器並返回結束迭代器。當然,這只是'std :: find'。 – GManNickG

5

你的「其他」條款的問題是:如果第一項是不匹配的「其他」踢,和你的「迴歸0」語句就會中斷你沒有嘗試向量中的任何其他元素,就退出'for'循環。

嘗試除去'else',並在'for'循環結束後將'return 0'移動到

+0

哦,我剛注意到它。愚蠢的錯誤。 –

+2

** **之後** ** break **將永遠不會被調用。 – ssell

+0

另外,如果沒有匹配,Vitus有一個關於返回-1而不是0的很好的觀點。 –

1

由於當前寫入的方式,您的函數將始終返回0。如果在向量的第一項中找到匹配項,則減法的結果當然是零。如果不匹配,則else部分執行並返回0,並且函數退出。

功能或許應該看起來像我通過恆定的參考值傳遞的載體,而不是這個

int findInItemvector(const vector<Item>& vec, string name) 
{ 
    for(vector<Item>::const_iterator it = vec.begin(); it < vec.end(); it++) 
    { 
     if(it->getName() == name) 
     { 
      return it - vec.begin(); 
     } 
    } 
    return -1; 
} 

通知,這樣可以防止載體的不必要的副本從時,此功能正在取得調用。 另外,你應該使用-1而不是0來表示失敗,因爲如果你正在查找的字符串在向量的第一個元素中,後者是合法的結果。