我有一个这样的矢量:
struct RIFT_MONSTER_SPAWN
{
DWORD dwWorldId;
D3DXVECTOR3 vPos;
};
vector<RIFT_MONSTER_SPAWN> vecMSpawn;
正如您所看到的,它将包含2个值dwWorldId
和D3DXVECTOR3 vPos;
vPos
将保留x,y,z
值。
现在我要做的是循环真实的向量,如果worldId
匹配正在传递的worldId
。它应该返回与vPos
相关联的worldId
。
如果使用std::find find_all
和count
。
但它总是返回错误
binary ==没有找到哪个运算符的类型为
所以我对此有点困惑。任何帮助将不胜感激。
亲切的问候。
以下是给我提问的代码
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);
}
答案 0 :(得分: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)
答案 1 :(得分:2)
您可以将谓词(可以是lambda)传递给std::find_if
代码
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++;
}
答案 2 :(得分: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;
});