C++矢量中找到一些东西
C++ finding something in vector
本文关键字:C++ 更新时间:2023-10-16
>我有一个这样的向量:
struct RIFT_MONSTER_SPAWN
{
DWORD dwWorldId;
D3DXVECTOR3 vPos;
};
vector<RIFT_MONSTER_SPAWN> vecMSpawn;
如您所见,它将保存 2 个值dwWorldId
和D3DXVECTOR3 vPos;
vPos
将保持x,y,z
价值。
现在我想做的是循环向量,如果worldId
与正在传递的worldId
匹配。它应该返回与worldId
相关的vPos
。
如果有使用std::find find_all
和count
。但它总是返回错误二进制 == 找不到采用左手运算符类型的运算符
所以我有点坚持这一点。任何帮助将不胜感激。
亲切的问候。
这是给我带来问题的代码
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);
}
您必须修改结构才能在查找过程中比较值:
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)
你可以传递一个谓词(可以是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++;
}
使用 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;
});
相关文章:
- 没有找到相关文章