Как найти что-то в векторе - PullRequest
1 голос
/ 18 ноября 2011

У меня есть указатель на Вектор со зданиями.

vector<building> * building1;
building1 = gamer.getBuilding(); ( building1 is a pointer to vector with all buildings that gamer has on that moment. )

Теперь я хочу проверить, существует ли в этом векторе здание, называемое, например, домом.

Я думал, что смогу сделать что-то вроде

vector<building>::iterator it;

it = find((*building1).begin(), (*building1).end(),buildings::house);

где здания - это перечисление.

но это не работает.

Может кто-нибудь мне помочь?

С уважением,

Ответы [ 3 ]

3 голосов
/ 18 ноября 2011

Ответ будет зависеть от определения 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
);
3 голосов
/ 18 ноября 2011

Вы можете использовать std::find_if. Требуется предикат в качестве третьего аргумента. Таким образом, вы можете написать функцию или объект функции и использовать их в качестве предиката. Синтаксис использования будет:

std::vector<building>::iterator it = std::find_if(v.begin(), 
                                                    v.end(), 
                                                    predicate);

А в C ++ 11 вы можете использовать лямбда-выражения напрямую как:

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.

0 голосов
/ 18 ноября 2011

Вы можете использовать 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...