2009-02-26 71 views
22

再次與我的向量。我希望我不會太煩人。我有這樣的結構:向量,結構和std ::找到

struct monster 
{ 
    DWORD id; 
    int x; 
    int y; 
    int distance; 
    int HP; 
}; 

所以我創建了一個向量:

std::vector<monster> monsters; 

但現在我不知道如何通過矢量搜索。我想在矢量中找到怪物的ID。

DWORD monster = 0xFFFAAA; 
it = std::find(bot.monsters.begin(), bot.monsters.end(), currentMonster); 

但顯然它不起作用。我只想通過結構的.id元素進行迭代,我不知道該怎麼做。非常感謝幫助。謝謝 !

回答

33

std::find_if

it = std::find_if(bot.monsters.begin(), bot.monsters.end(), 
     boost::bind(&monster::id, _1) == currentMonster); 

或者自己寫函數對象,如果你沒有提升。應該是這樣的

struct find_id : std::unary_function<monster, bool> { 
    DWORD id; 
    find_id(DWORD id):id(id) { } 
    bool operator()(monster const& m) const { 
     return m.id == id; 
    } 
}; 

it = std::find_if(bot.monsters.begin(), bot.monsters.end(), 
     find_id(currentMonster)); 
+0

使用boost,完美! – 2014-11-14 16:05:55

+0

我想知道,如果我有`{int,int}`,我可以將它轉換爲`long`並使用普通查找嗎? – 2015-10-20 14:39:36

13

你需要編寫自己的搜索謂詞:

struct find_monster 
{ 
    DWORD id; 
    find_monster(DWORD id) : id(id) {} 
    bool operator() (const monster& m) const 
    { 
     return m.id == id; 
    } 
}; 

it = std::find_if(monsters.begin(), monsters.end(), find_monster(monsterID)); 
+0

不錯的答案,但在構造函數中存在拼寫錯誤。它應該是':'不是';' – 2012-08-24 15:16:26

+0

除了編寫自己的搜索謂詞外,還需要使用`std :: find_if`而不是`std :: find`。 – 2012-08-25 16:34:26

7

看看在std::find模板,尤其是第三個參數:

template<class InputIterator, class EqualityComparable> 
InputIterator find(InputIterator first, InputIterator last, 
       const EqualityComparable& value); 

這是什麼EqualityComparable的?再次從文檔:

A type is EqualityComparable if objects of that type can be 
compared for equality using operator==, and if operator== is 
an equivalence relation. 

現在,你的類型怪物需要定義這樣一個運算符。如果你沒有編譯器爲你生成一個(也就是默認的ctor和dtor),那麼這個編譯器在你的情況下不起作用。因此,使用std::find首先定義一個比較函數/仿函數,該算法可以用它來匹配您currentMonster即沿着線的東西:

struct monster { 
    // members 
    bool operator==(const monster& l, const monster& r) const 
    { 
    return l.id == r.id; 
    } 
}; 
7

怎麼樣:

std::find_if(monsters.begin(), 
      monsters.end(), 
      [&cm = currentMonster] 
      (const monster& m) -> bool { return cm == m; }); 
1

或把怪物地圖上,而不是一個矢量

,或者如果它們必須在載體中創建ID的索引圖即圖矢量索引

0

這是一個COMPLE基於Johannes Schaub(boost版本)的答案進行抽樣。

#include <algorithm> 
#include <boost/bind.hpp> 

struct monster 
{ 
    DWORD id; 
    int x; 
    int y; 
    int distance; 
    int HP; 
}; 

int main() 
{ 
    std::vector<monster> monsters; 

    monster newMonster; 
    newMonster.id = 1; 
    newMonster.x  = 10; 
    monsters.push_back (newMonster); 

    newMonster.id = 2; 
    newMonster.x  = 20; 
    monsters.push_back (newMonster); 

    newMonster.id = 2; 
    newMonster.x  = 30; 
    monsters.push_back (newMonster); 

    DWORD monsterId = 2; 

    std::vector<monster>::iterator it = std::find_if (monsters.begin(), monsters.end(), 
     boost::bind (&monster::id, _1) == monsterId); 

    return 0; 
}