2012-11-09 56 views
3

我正在嘗試使用矢量實現來創建庫存系統,但我似乎遇到了一些麻煩。我遇到了使用我製作的結構的問題。注意:這實際上並不在遊戲代碼中,這是一個單獨的解決方案,我正在使用它來測試我對向量和結構的知識!如何搜索向量中的結構項目?

struct aItem 
{ 
    string itemName; 
    int  damage; 
}; 

int main() 
{ 
    aItem healingPotion; 
    healingPotion.itemName = "Healing Potion"; 
    healingPotion.damage= 6; 

    aItem fireballPotion; 
    fireballPotion.itemName = "Potion of Fiery Balls"; 
    fireballPotion.damage = -2; 

    vector<aItem> inventory; 
    inventory.push_back(healingPotion); 
    inventory.push_back(healingPotion); 
    inventory.push_back(healingPotion); 
    inventory.push_back(fireballPotion); 

    if(find(inventory.begin(), inventory.end(), fireballPotion) != inventory.end()) 
       { 
         cout << "Found"; 
       } 

    system("PAUSE"); 
    return 0; 
} 

見前代碼給我下面的錯誤:

1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(3186): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'aItem' (or there is no acceptable conversion)

還有更多的錯誤,如果你需要它,請讓我知道。我敢打賭,這是一個小而愚蠢的事情,但我一直在嘔吐超過兩個小時。提前致謝!

+1

如果使用矢量和的push_back(healingPotion)你的問題就會迎刃而解。這也將允許你繼承一個項目。 –

回答

4

find方法不知道如何比較兩個aItem對象的相等性。你需要在你的結構定義來定義==運營商,像這樣:

bool operator==(aItem other) 
{ 
    if (itemName == other.itemName && damage == other.damage) 
     return true; 
    else 
     return false; 
} 

這將使find確定兩個aItem對象是相等的,這是必要的算法工作。

+4

每當你寫'if(c)return true;否則返回false;',只寫'return c;'。 – GManNickG

+0

當然。只是想最大限度地清晰。你會建議總是提供最好的答案嗎?或者你認爲有時值得讓事情簡單些,以確保提問的人理解答案,特別是與問題相關的部分? – Jeff

+0

最大限度地提高清晰度意味着省略噪音。所以是的,最大清晰度是好的,不必要的分支是不好的。 – GManNickG

5

find尋找與矢量中的項目相同的東西。你說你想用字符串進行搜索,但是你沒有爲它寫代碼;它試圖比較整個結構。而且你還沒有編寫代碼來比較整個結構,所以它給了你一個錯誤。

最簡單的解決方案是使用顯式循環代替find

如果你想要find字符串的東西,使用find_if變種,並編寫一個謂詞函數,查看字符串。或者,如果您想在整個結構中使用find,那麼您可以在結構上定義一個operator ==,該結構可以比較itemNamedamage

或者您也可以考慮使用mapunordered_map數據結構而不是vector。地圖容器被設計爲使用鍵(例如字符串)進行快速查找。

+0

對不起,我的「字符串」註釋僅僅是爲了讓人們知道我在查找字符串時已成功搜索,但是一旦我切換到結構項目,它就停止工作。對不起,我不清楚! –

+0

+1'最簡單的解決方案是使用顯式循環代替查找。'不值得跳過這些環節試圖找到與其他任何東西,但直接比較的工作。 – Kylotan

0

嘗試類似:

#include <iostream> 
#include <vector> 
using namespace std; 
struct item { 
    item(string const name,int const damage):name_(name),damage_(damage) { 

    } 
    string name_; 
    int damage_; 
}; 
int main(int argc, char** argv) { 
    vector<item *> items; 
    item healingPostion("cure light",-10); 
    item fireballPostion("fireball",10); 
    items.push_back(&healingPostion); 
    items.push_back(&fireballPostion); 
    if(find(items.begin(), items.end(), &fireballPostion) != items.end()) { 
     cout << "Found"; 
    } 
    return 0; 
}