首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++在向量中查找某些内容

C++在向量中查找某些内容
EN

Stack Overflow用户
提问于 2016-12-31 15:43:57
回答 3查看 111关注 0票数 0

我有一个这样的向量:

代码语言:javascript
复制
struct RIFT_MONSTER_SPAWN
{
    DWORD dwWorldId;
    D3DXVECTOR3 vPos;
};

vector<RIFT_MONSTER_SPAWN> vecMSpawn;

如你所见,它将保存两个值,dwWorldIdD3DXVECTOR3 vPos;vPos将保存x,y,z值。

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

如果使用了std::find find_allcount。但它始终返回错误binary == no operator found,该错误采用左手运算符

所以我有点卡在这上面了。任何帮助都将不胜感激。

向您致以亲切的问候。

下面是给我带来问题的代码

代码语言:javascript
复制
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定义为

代码语言:javascript
复制
vector<RIFT_MONSTER_SPAWN> m_vecMSpawnPoint;

另外,为了填充它,我使用了以下代码

代码语言:javascript
复制
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);
        }
EN

回答 3

Stack Overflow用户

发布于 2016-12-31 16:15:24

您必须修改您的结构,以便能够在查找过程中比较值:

代码语言:javascript
复制
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);

也许只是一种类型,但在您的代码中,您有

代码语言:javascript
复制
void CRiftMatch::GetMoverSpawnPoints(dwWorldId)

但它应该是

代码语言:javascript
复制
void CRiftMatch::GetMoverSpawnPoints(DWORD dwWorldId)
票数 2
EN

Stack Overflow用户

发布于 2016-12-31 16:18:28

您可以将谓词(可以是lambda)传递给std::find_if so代码

代码语言:javascript
复制
  auto it = std::find_if(vecSpawn.begin(), vecSpawn.end(),
                         [&] (const struct RIFT_MONSTER_SPAWN& sp) 
                            {return sp.dxWorldId == dwWorldIt;});

但在这种情况下,我会简单地使用for循环(因为我发现它更具可读性):

代码语言:javascript
复制
  int ix=0;
  for (auto&sp : vecSpawn) {
     if (sp.dxWorldId == dwWorldIt) 
        return vecSpawn.begin() + ix;
     ix++;
  }
票数 2
EN

Stack Overflow用户

发布于 2016-12-31 17:19:25

使用range/v3,您可以简单地执行以下操作

代码语言:javascript
复制
auto it = ranges::find(vecSpawn, dwWorldIt, &RIFT_MONSTER_SPAWN::dxWorldId);

否则你必须使用更多的冗长

代码语言:javascript
复制
auto it = std::find_if(vecSpawn.begin(), vecSpawn.end(),
                       [&](const RIFT_MONSTER_SPAWN& e) {
                           return e.dxWorldId == dwWorldIt;
                       });
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41406473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档