C ++在向量中找到一些东西

时间:2016-12-31 07:43:57

标签: c++ vector

我有一个这样的矢量:

struct RIFT_MONSTER_SPAWN
{
    DWORD dwWorldId;
    D3DXVECTOR3 vPos;
};

vector<RIFT_MONSTER_SPAWN> vecMSpawn;

正如您所看到的,它将包含2个值dwWorldIdD3DXVECTOR3 vPos; vPos将保留x,y,z值。

现在我要做的是循环真实的向量,如果worldId匹配正在传递的worldId。它应该返回与vPos相关联的worldId

如果使用std::find find_allcount。 但它总是返回错误 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);
        }

3 个答案:

答案 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;
                       });