我有一个指向带建筑物的Vector的指针。
vector<building> * building1;
building1 = gamer.getBuilding(); ( building1 is a pointer to vector with all buildings that gamer has on that moment. )
现在我想检查是否在该向量中存在一个名为house的建筑物。
我以为我可以做点什么
vector<building>::iterator it;
it = find((*building1).begin(), (*building1).end(),buildings::house);
建筑物是一个枚举。
但这不起作用。
有人可以帮助我吗?
亲切的问候,答案 0 :(得分:3)
您可以使用std::find_if
。它需要谓词作为第三个参数。因此,您可以编写函数或函数对象,并将其用作谓词。用法的语法是:
std::vector<building>::iterator it = std::find_if(v.begin(),
v.end(),
predicate);
在C ++ 11中,您可以直接使用lambda:
auto it = std::find_if(v.begin(), v.end(),
[](const building & b)
{
//your code: which object you want to find?
//for example
return b.Name == "GhostBuilding";
});
请注意auto
的用法。
答案 1 :(得分:3)
答案取决于您未展示的building
的定义。但一般来说,当你不想按价值找到但通过谓词找到时,你会使用find_if
:
struct building_of_type
{
public:
explicit building_of_type( buildings type ) : _type( type ){}
bool operator ()( building const& b ) const { return is b of type _type?; }
private:
buildings const _type;
};
std::find_if(
building1->begin(), building1->end()
, building_of_type( buildings::house )
);
或更简单的案例:
bool is_building_a_house( building const& b ){ return is b of type house?; }
std::find_if(
building1->begin(), building1->end()
, is_building_a_house
);
答案 2 :(得分:0)
您可以std::find_if
使用binary_function
:
struct BuildingExistsPredicate : public std::binary_function<BuildingType, std::string, bool> {
bool operator()(const BuildingType& building, const std::string& name) const {
return building.name == name;
}
};
然后
vector<BuildingType> *building1 = gamer.getBuilding();
vector<BuildingType>::iterator it = std::find_if(building1->begin(), building1->end(), std::bind2nd(BuildingExistsPredicate(), "house"));
if(it == building1->end()) {
std::cerr << "Building not found\n";
return;
}
// it now points to the first building whose name is "house"
如果找到该项目,it
将指向该项目。否则,it
将指向building1->end()