据我所知,您还需要在内部和外部 lambda 中捕获“名称”。
另一方面,实体不能被捕获,因为它是一个函数参数。
另外,我不鼓励您使用std::list<Entity*>>
.
使用相当std::list<Entity*> >
,因为一些编译器将前者误解为 operator< 和 operator>>。
更正了代码以使其编译:(string & name
由 ref 捕获。)
Entity *Engine::findEntity(const std::string &name)
{
using namespace std;
for_each(p_entities.begin(), p_entities.end(),
[&name](pair<const int, const list<Entity*>>& pair)
{
for_each((pair.second).begin(),(pair.second).end(),
[&name](const Entity* entity)
{
if ( entity->getAlive() == true && entity->getName() == name )
return entity;
});
});
return nullptr;
}
我会仔细检查这段代码,但现在应该没问题。(除了你放错了一些 &'s:pair 应该是 const ref,entity 应该只是一个普通的 const 指针。)
建议:为了使您的代码更具可读性,您可以将 lambda 标头拆分到下一行,也可以使用 in-function using namespace std
。
更新:您的代码中仍然存在错误。return
仅从 lambda 返回,但找到的实体永远不会返回。
UPDATE2:进一步更正,以便函数正确运行:
// returns the last found entity.
const Entity *Engine::findEntity(const std::string &name)
{
using namespace std;
const Entity * found_entity=nullptr;
for_each(p_entities.begin(), p_entities.end(),
[&name, &found_entity](pair<const int, const list<Entity*> >& pair)
{
for_each((pair.second).begin(),(pair.second).end(),
[&name, &found_entity](const Entity* entity)
{
if( entity->getAlive() == true && entity->getName() == name )
found_entity = entity; // here you need to modify the variable captured from the outside.
});
});
return found_entity;
}
但我不会for_each
在这种情况下使用,因为它没有,break
所以即使在找到实体之后它也必须完成循环。我宁愿在这里使用迭代器。
这部分仅适用于 OP。这就是我填补空白的方式(整个代码):
#include <iostream>
#include <list>
#include <string>
#include <map>
#include <algorithm>
class Entity{
public:
bool getAlive() const {return true;}
std::string getName() const {return "Barna";}
};
class Engine{
public:
const Entity *findEntity(const std::string& name);
private:
std::map<int, const std::list<Entity*> > p_entities;
};
const Entity *Engine::findEntity(const std::string &name)
{
using namespace std;
const Entity* found_entity = nullptr;
for_each(p_entities.begin(), p_entities.end(),
[&name, &found_entity](pair<const int, const list<Entity*> >& pair)
{
for_each((pair.second).begin(),(pair.second).end(),
[&name, &found_entity](const Entity* entity)
{
if ( entity->getAlive() == true && entity->getName() == name )
found_entity = entity;
});
});
return found_entity;
}
int main()
{
Engine e;
e.findEntity("he");
}