В stdlib вместо указателей используются итераторы.В заголовке algorithm
вы найдете шаблоны функций find
и find_if
.Первый выполняет поиск элемента по значению идентификатора, а второй - по предикату и возвращает iterator
к первому совпадению.Вы можете добавить перегрузку для operator==
в свой класс person и использовать первую версию или написать предикат и перейти ко второй.
Вот пример предиката:
struct person_equal {
bool operator()(const person& p, const char* name) {
return strcmp(p.name, name);
}
};
Обратите внимание, что он использует C-функцию strcmp
.Вы должны хранить std::stringS
в ваших person
объектах вместо char*
.
Теперь этот предикат принимает два элемента, но find_if
ожидает унарный предикат.Вам нужно bind
второй параметр для некоторого фиксированного значения.Здесь я использую устаревший bind2nd
.Вам следует либо использовать boost:::bind
, либо заменить C ++ TR1.
std::find_if(vec.begin(), vec.end(), std::bind2nd(person_equal(), "foobar"));
В C ++ 0x вы должны использовать лямбду:
std::find_if(v.begin(), v.end(), [](const person& p) { return strcmp(p.name, "foobar"); });
Или вы можете просто повторить:
std::vector<person>::iterator my_find(std::vector<person>& v) {
for(std::vector<person>::iterator it = v.begin(), it != v.end(), ++it) {
if(strcmp(it->name, "foobar")) return it;
}
}