Первый комментарий
Вы можете изменить свою функцию доступа на более простую форму
return unitCode == uCode;
Теперь к тому, для чего мы здесь
Вам лучше искать позицию элемента, а не его индекс. Получение элемента из его индекса является операцией O (n), тогда как получение элемента из его позиции является операцией O (1). Итак, с STL и небольшой помощью от boost::bind()
:
#include <algorithm>
#include <boost/bind.hpp>
// ...
std::string uCode("uCode to search for");
std::list<Unit*>::iterator pos = std::find_if(unitCollection.begin(),
unitCollection.end(),
boost::bind(&Unit::isUnit,
_1, uCode));
STL имеет std::mem_fun()
, что вместе с std::bind2nd()
даст тот же результат. Проблема в том, что mem_fun()
работает только с функциями-членами, которые не принимают аргументов. boost::bind()
, с другой стороны, гораздо мощнее и решает проблему здесь очень хорошо. Вы должны ожидать этого в следующем стандарте, который должен быть здесь сразу после прибытия Мессии.
Но если у вас нет поддержки
Если у вас еще нет поддержки в вашем проекте, тогда вы действительно должны установить его. Если стандартная библиотека - жена C ++, то Boost - молодой любитель C ++. Они оба должны быть там, они прекрасно ладят.
Сказав это, вы можете извлечь функцию в отдельный объект функции, как уже упоминал Питер:
struct has_uCode {
has_uCode(cont std::string& uc) : uc(uc) { }
bool operator()(Unit* u) const { return u->isUnit(uc); }
private:
std::string uc;
};
Затем вы можете позвонить std::find_if()
так:
std::list<Unit*>::iterator pos = std::find_if(unitCollection.begin(),
unitCollection.end(),
has_uCode("this and that"));
И немного о производительности
Еще одна вещь: я не знаю, как выглядит uCode, но если они большие, вы могли бы ускорить процесс, поддерживая хэши этих строк, чтобы в предикате поиска вы сравнивали только хэши. Хэши могут быть обычными целыми числами: сравнение целых чисел выполняется довольно быстро.
Еще одна вещь: если вы часто запускаете эту процедуру поиска, вы можете также подумать об изменении типа контейнера, потому что это действительно дорогая процедура: в порядке длины списка.