我有一个这样的向量:
struct RIFT_MONSTER_SPAWN
{
DWORD dwWorldId;
D3DXVECTOR3 vPos;
};
vector<RIFT_MONSTER_SPAWN> vecMSpawn;如你所见,它将保存两个值,dwWorldId和D3DXVECTOR3 vPos;,vPos将保存x,y,z值。
现在我要做的是循环向量,如果worldId与传递的worldId匹配。它应该返回与worldId相关的vPos。
如果使用了std::find find_all和count。但它始终返回错误binary == no operator found,该错误采用左手运算符
所以我有点卡在这上面了。任何帮助都将不胜感激。
向您致以亲切的问候。
下面是给我带来问题的代码
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);
}在.h文件中,m_vecMSpawnPoint定义为
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);
}发布于 2016-12-31 16:15:24
您必须修改您的结构,以便能够在查找过程中比较值:
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)发布于 2016-12-31 16:18:28
您可以将谓词(可以是lambda)传递给std::find_if so代码
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++;
}发布于 2016-12-31 17:19:25
使用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;
});https://stackoverflow.com/questions/41406473
复制相似问题