2013-07-11 96 views
0

我一直在試圖找出什麼是在矢量中查找對象的最佳方法。目前,我嘗試使用找到這個對象上:在向量中查找對象C++

class Category 
{ 
public: 
    string modeType; 
    vector<VideoMode> videoModes; 

    Category(){} 

    Category(string name) 
    { 
    modeType = name; 
    } 

    friend bool operator== (const Category &c1, const string &c2) 
    { 
    return c1.modeType == c2; 
    } 

}; 

,這是我的發現:

vector<Category>::iterator category = find(modes.begin(), modes.end(), Category("Name")); 

我得到一個錯誤,當我嘗試編譯說,有「無運營商發現了需要型「類別」的左側操作數爲「==」我看着算法頭,發現查找代碼:

template<class _InIt, 
class _Ty> inline 
_InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val) 
{ // find first matching _Val 
for (; _First != _Last; ++_First) 
    if (*_First == _Val) 
     break; 
return (_First); 
} 

我真的不知道在哪裏可以從這裏走,雖然任何建議會。成爲一個ppreciated,我不知道C++是很好:(

+0

如果只訪問公共成員,它應該不是真正的朋友功能。使它成爲非朋友免費的功能,並且我會爲這兩個參數使用'Category'。如果用'string'調用它,它將被轉換。唯一可能會混淆的是字符串文字(至少在我們得到它們的後綴之前)。 – chris

+0

將它更改爲字符串類別使其工作,並感謝您的建議。如果您將其作爲答案張貼,我可以接受它作爲最佳答案,謝謝! – WWaldo

回答

0

您已經定義operator==採取Categorystd::string,但你想找到一個Category,這operator==無定義。在這種情況下,你可以只是傳遞字符串字面:

find(modes.begin(), modes.end(), "Name") 

不過,我會建議改變平等的運營商採取另一種Category。比較相同類型的兩個對象是邏輯的,並且這種方式在字符串位於左側而沒有額外過載的情況下起作用,因爲您的類型可以從std::string隱式轉換。我也建議不要使之成爲朋友,因爲它沒有訪問任何超過公共成員:

bool operator==(const Category &lhs, const Category &rhs) { 
    return lhs.modeType == rhs.modeType; 
} 

要使用此與std::find將工作你有它的方式,但如果你通過一個字符串。這是因爲它必須經過兩次用戶定義的轉換才能到達您的班級(std::string,然後是您的班級),但只能執行一次。保持重載下,最好的解決辦法,一旦C++ 14走來是使新的字面後綴的使用:

find(modes.begin(), modes.end(), "Name"s) 
           ^std::string because of the s 

現在,它總是可以定義自己_s做同樣的。我個人更喜歡用戶添加一個s_s來增加兩個重載或重載構造函數以構造std::string可構造的類型。這感覺就像沒有意義的額外工作,只會增加模糊性的可能性。