2016-12-31 69 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

更详细的变体就是我的答案。 –