Векторы, структуры и std :: find

Опять меня с векторами. Надеюсь, я не слишком раздражаю. У меня есть такая структура:

struct monster { DWORD id; int x; int y; int distance; int HP; }; 

Поэтому я создал вектор:

 std::vector monsters; 

Но теперь я не знаю, как искать вектор. Я хочу найти идентификатор монстра внутри вектора.

 DWORD monster = 0xFFFAAA; it = std::find(bot.monsters.begin(), bot.monsters.end(), currentMonster); 

Но, очевидно, это не сработает. Я хочу выполнять итерацию только через .id-элемент структуры, и я не знаю, как это сделать. Помощь очень ценится. Благодаря !

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 { 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)); 

Вам нужно написать собственный предикат поиска:

 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)); 

как насчет:

 std::find_if(monsters.begin(), monsters.end(), [&cm = currentMonster] (const monster& m) -> bool { return cm == m; }); 

Взгляните на шаблон std::find , третий параметр, особенно:

 template 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 т. currentMonster то вроде:

  struct monster { // members bool operator==(const monster& l, const monster& r) const { return l.id == r.id; } }; 

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

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

Это полный образец, основанный на ответе Йоханнеса Шауба (ускоренная версия).

 #include  #include  struct monster { DWORD id; int x; int y; int distance; int HP; }; int main () { std::vector monsters; monster newMonster; newMonster.id = 1; newMonster.x = 10; monsters.push_back ( newMonster ); newMonster.id = 2; newMonster.x = 20; monsters.push_back ( newMonster ); newMonster.id = 2; newMonster.x = 30; monsters.push_back ( newMonster ); DWORD monsterId = 2; std::vector< monster >::iterator it = std::find_if ( monsters.begin (), monsters.end (), boost::bind ( &monster::id, _1 ) == monsterId ); return 0; } 
Interesting Posts

Установка переменной в NULL после

MySQL конвертирует вывод timediff в день, час, минуту, второй формат

Почему разделение двух int не дает правильного значения при присвоении двойной?

Найти текущую медиану из streamа целых чисел

Поддержка \ K в regex

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

Заполнение наборов результатов в MySQL

Удаление цветовых кодов ANSI из текстового потока

VirtualBox: использование физического раздела в качестве виртуального диска

Сортировка с использованием Comparator-Descending order (Пользовательские classы)

Безопасно ли получать значения из java.util.HashMap из нескольких streamов (без изменений)?

Почему не могут быть защищены или публиковаться в Java?

Почему ссылки не переустанавливаются в C ++

Строковые литералы: указатель против массива символов

Почему общее использование памяти, сообщаемое диспетчером задач Windows, намного выше, чем сумма использования памяти всех процессов?

Давайте будем гением компьютера.