2016-12-31 98 views
0

找到的東西我有一個這樣的載體:C++中的矢量

struct RIFT_MONSTER_SPAWN 
{ 
    DWORD dwWorldId; 
    D3DXVECTOR3 vPos; 
}; 

vector<RIFT_MONSTER_SPAWN> vecMSpawn; 

正如你可以看到它將於2個值dwWorldIdD3DXVECTOR3 vPos; vPos將舉行x,y,z值。

現在我想要做的是循環真正的向量,如果worldId匹配worldId是beeing通過。它應該返回vPos,這是相關的worldId。如果使用std::find find_allcount。 但它總是返回錯誤 二進制==找不到操作符,它需要一個類型爲

的左手操作符

所以我有點卡在這個。任何幫助,將不勝感激。

祝好。

這是給我的問題

void CRiftMatch::GetMoverSpawnPoints(dwWorldId) 
{ 
    std::vector<RIFT_MONSTER_SPAWN> vecSpawn = CRiftMng::GetInstance()->m_vecMSpawnPoint; 
    std::vector<RIFT_MONSTER_SPAWN>::iterator it = std::find(vecSpawn.begin(), vecSpawn.end(), dwWorldId); 
    OUTPUTDEBUGSTRING("\n GetMoverSpawn %d", *it); 
} 

m_vecMSpawnPoint在.h文件中被定義爲

vector<RIFT_MONSTER_SPAWN> m_vecMSpawnPoint; 

也填補它我使用這個代碼

while (Lua.TableLoop(-2)) 
     { 
      RIFT_MONSTER_SPAWN rSpawnPoint; 
      rSpawnPoint.dwWorldId = static_cast<int>(CScript::GetDefineNum(Lua.GetFieldToString(-1, "dwWorldId"))); 
      rSpawnPoint.vPos.x = static_cast<float>(Lua.GetFieldToNumber(-1, "x")); 
      rSpawnPoint.vPos.y = static_cast<float>(Lua.GetFieldToNumber(-1, "y")); 
      rSpawnPoint.vPos.z = static_cast<float>(Lua.GetFieldToNumber(-1, "z")); 

      m_vecMSpawnPoint.push_back(rSpawnPoint); 
      Lua.Pop(1); 
     } 
+2

這不是一個向量,這是一個結構,即使是D3DXVECTOR3也是一個結構。您應該發佈導致錯誤的代碼。 – 2016-12-31 07:50:06

+0

使用std:find_if並提供您自己的比較函數。 – Jonas

+0

void CRiftMatch :: GetMoverSpawnPoints(dwWorldId) std :: vector vecSpawn = CRiftMng :: GetInstance() - > m_vecMSpawnPoint; \t std :: vector :: iterator it = std :: find(vecSpawn.begin(),vecSpawn.end(),dwWorldId); (「\ n GetMoverSpawn%d」,* it); } –

回答

2
代碼

您必須修改您的結構以便能夠在查找過程中比較值:

struct RIFT_MONSTER_SPAWN 
{ 
    DWORD dwWorldId; 
    D3DXVECTOR3 vPos; 

    bool operator() (const RIFT_MONSTER_SPAWN & m) const 
    { 
     return m.dwWorldId == dwWorldId; 
    } 
}; 

RIFT_MONSTER_SPAWN monsterToFind; 
monsterToFind.dwWorldId = dwWorldId; 

it = std::find_if(vecSpawn.begin(), vecSpawn.end(), monsterToFind); 

也許只是一個類型,但在你的代碼,你有

void CRiftMatch::GetMoverSpawnPoints(dwWorldId) 

,但它應該是

void CRiftMatch::GetMoverSpawnPoints(DWORD dwWorldId) 
+0

甚至不需要修改結構。事實上,似乎將這種類型轉化爲它自己的謂詞。 – juanchopanza

+0

謝謝。但我不太明白。例如,如何在發現dwWorldId時輸出vPos? 我是C++的新手,所以這就是爲什麼我想了解它是如何工作的。 –

+0

您可以找到整個結構。從此,你可以得到vPos和dwWorldId –

2

你可以通過一個謂詞(它可以是一個lambda )至std::find_if so code

auto it = std::find_if(vecSpawn.begin(), vecSpawn.end(), 
         [&] (const struct RIFT_MONSTER_SPAWN& sp) 
          {return sp.dxWorldId == dwWorldIt;}); 

但在這種情況下,我會簡單地用一個for循環(因爲我發現,更易讀):

int ix=0; 
    for (auto&sp : vecSpawn) { 
    if (sp.dxWorldId == dwWorldIt) 
     return vecSpawn.begin() + ix; 
    ix++; 
    } 
+0

@ juanchopanza:謝謝,糾正! –

2

隨着range/v3,你可以簡單地做

auto it = ranges::find(vecSpawn, dwWorldIt, &RIFT_MONSTER_SPAWN::dxWorldId); 

否則你必須使用更詳細的

auto it = std::find_if(vecSpawn.begin(), vecSpawn.end(), 
         [&](const RIFT_MONSTER_SPAWN& e) { 
          return e.dxWorldId == dwWorldIt; 
         }); 
+0

更詳細的變體就是我的答案。 –