2016-12-31 5 views
0

で見つける何かが私はこのようなベクトルを持っている:C++ベクトル

struct RIFT_MONSTER_SPAWN 
{ 
    DWORD dwWorldId; 
    D3DXVECTOR3 vPos; 
}; 

vector<RIFT_MONSTER_SPAWN> vecMSpawn; 

あなたはそれがx,y,z値を保持する2つの値dwWorldIdD3DXVECTOR3 vPos; vPosを開催します見ることができるように。

私がしたいことは、ベクトルが真でループし、worldIdがbeeingが渡されたworldIdと一致する場合です。それはworldIdに関連しているvPosを返します。

std::find find_allcountを使用している場合。 しかし、常に バイナリ==演算子が見つかりませんでした左手の演算子のタイプ

私はこれに固執しています。どんな助けもありがとう。

親切でよろしくお願いいたします。ここで

は、私はこのコード

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); 
     } 
+2

これはベクトルではなく、構造体でもあり、D3DXVECTOR3も構造体です。エラーの原因となっているコードを投稿する必要があります。 –

+0

std:find_ifを使用して、独自の比較機能を提供してください。 – Jonas

+0

void CRiftMatch :: GetMoverSpawnPoints(dwWorldId) { \t std :: vector vecSpawn = CRiftMng :: GetInstance() - > m_vecMSpawnPoint; \t std :: vector ::イテレータit = std :: find(vecSpawn.begin()、vecSpawn.end()、dwWorldId); \t OUTPUTDEBUGSTRING( "\ n GetMoverSpawn%d"、* it); } –

答えて

2
を使用しています、それを埋めるためにも
vector<RIFT_MONSTER_SPAWN> m_vecMSpawnPoint; 

として.hファイルで定義されている私の問題

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を与えているコードです

検索時に値を比較できるように構造体を変更する必要があります。

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) 
+0

構造体を変更する必要はありません。実際、それは型をそれ自身の述語に変えているようです。 – juanchopanza

+0

ありがとうございます。しかし、私はそれをかなり理解していません。たとえば、dwWorldIdが見つかったときにvPosを出力する方法は? 私はC++の新人です。だからこそ私はそれがどのように動作するのか理解しようとしています。 –

+0

構造体全体が見つかりました。それで、あなたはvPosとdwWorldIdを得ることができます –

2

する必要がありますあなたは、ラムダ可能述語を(渡すことができます)〜std::find_ifだからコード

auto it = std::find_if(vecSpawn.begin(), vecSpawn.end(), 
         [&] (const struct RIFT_MONSTER_SPAWN& sp) 
          {return sp.dxWorldId == dwWorldIt;}); 

しかし、(私は読みやすくすることを見つけるために)このような場合には、私は単純にforループを使用します。range/v3

int ix=0; 
    for (auto&sp : vecSpawn) { 
    if (sp.dxWorldId == dwWorldIt) 
     return vecSpawn.begin() + ix; 
    ix++; 
    } 
+0

@元食館:ありがとう、訂正しました! –

2

、あなたは、単に他の

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; 
         }); 
+0

もっと冗長なものが私の答えです。 –