Векторы, структуры и станд.:: найти

Используйте команду цвета. Легкий и встроенный.

Color 0F

Черно-белый

Color 0A 

Черный и зеленый

30
задан Evgeny Lazin 26 February 2009 в 11:11
поделиться

6 ответов

std::find_if :

it = std::find_if(bot.monsters.begin(), bot.monsters.end(), 
        boost::bind(&monster::id, _1) == currentMonster);

Или запись Ваш собственный функциональный объект, если у Вас нет повышения. Был бы похож на это

struct find_id : std::unary_function<monster, bool> {
    DWORD id;
    find_id(DWORD id):id(id) { }
    bool operator()(monster const& m) const {
        return m.id == id;
    }
};

it = std::find_if(bot.monsters.begin(), bot.monsters.end(), 
         find_id(currentMonster));
36
ответ дан 27 November 2019 в 23:22
поделиться

Необходимо записать собственный поисковый предикат:

struct find_monster
{
    DWORD id;
    find_monster(DWORD id) : id(id) {}
    bool operator () ( const monster& m ) const
    {
        return m.id == id;
    }
};

it = std::find_if( monsters.begin(), monsters.end(), find_monster(monsterID));
15
ответ дан 27 November 2019 в 23:22
поделиться

Смотрите на эти std::find шаблон, третий параметр особенно:

template<class InputIterator, class EqualityComparable>
InputIterator find(InputIterator first, InputIterator last,
               const EqualityComparable& value);

, Каков этот EqualityComparable? Снова из документации:

A type is EqualityComparable if objects of that type can be 
compared for equality using operator==, and if operator== is 
an equivalence relation. 

Теперь, Ваш монстр типа должен определить такой оператор. Если Вы не делаете компилятор генерирует один для Вас (равно как и значение по умолчанию ctor и dtor), который делает memcmp вид вещи, которая не работает в Вашем случае. Так, для использования std::find первый определяют функцию/функтор компаратора, которую алгоритм может использовать для соответствия Вашему currentMonster т.е. что-то вроде:

 struct monster {
  // members
  bool operator==(const monster& l, const monster& r) const
  {
     return l.id == r.id;
  }
 };
9
ответ дан 27 November 2019 в 23:22
поделиться

Можно записать функцию как указано ниже:

monster* findMonster(DWORD currentMonster) {
    for (auto it = bot.monsters.begin(); it != bot.monsters.end(); it++) {
        if (it->id == currentMonster) {
            return &(*it);
        }
    }
    return NULL;
}

Это возвращает указатель на сохраненный узел, если это найдено в векторе, иначе ПУСТОЙ УКАЗАТЕЛЬ возвратов.

Обратите внимание на то, что return it; не будет работать непосредственно.

0
ответ дан 27 November 2019 в 23:22
поделиться
[

] как насчет:[

] [
std::find_if(monsters.begin(), 
             monsters.end(), 
             [&cm = currentMonster]
             (const monster& m) -> bool { return cm == m; }); 
]
15
ответ дан 27 November 2019 в 23:22
поделиться

или поместите монстров на карту вместо вектора

, или если они должны быть в векторе, создайте карту индекса, то есть карту идентификатора в индекс вектора

1
ответ дан 27 November 2019 в 23:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: