У меня есть std::vector
объектов указателей Person
, которые имеют функцию-член std::string getName() const
. Используя алгоритмы STL, я хочу подсчитать все объекты Person
в векторе, где getName()
возвращает «Чад».
Поведение, просто повторяющее цикл, будет таким:
int num_chads = 0;
for(std::vector<Person *>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
if((*it)->getName() == "Chad")
++num_chads;
}
Я хочу переработать его, чтобы он использовал все алгоритмы STL, функторы и т. д. (сделать его более функционально-ориентированным). Вот что я думаю, что мне нужно сделать:
const int num_chads = std::count_if(vec.begin(), vec.end(),
std::bind1st(std::bind2nd(std::equal_to, mem_fun(Person::getName)), "Chad"));
Как вы, наверное, понимаете, это не работает. Во-первых, насколько я понимаю, вы не можете использовать bind1st/bind2nd для объектов binder1st/binder2nd, так как они специально предназначены для работы с std::binary_functions
. Во-вторых, и это гораздо важнее, я не думаю, что использую правильную технику. Я действительно хочу привязать один из аргументов к "Chad", но с аргументом итератора я на самом деле просто хочу преобразовать значение итератора в строку перед вызовом связанной версии equals_to
.
Я думаю, что это можно сделать с помощью Boost, но возможно ли это, используя только ядро C++ 03 (т.е. без C++ 0x lambas!)?
РЕДАКТИРОВАТЬ: Может ли кто-нибудь привести пример, в котором не используется определяемый пользователем предикат (т.е. просто используются инструменты, предоставленные в наборе инструментов std)?
РЕДАКТИРОВАТЬ: В то время как ответ Матье является ответом из учебника о том, как использовать функторы в алгоритмах STL, ответ Кубби исходил из подхода, который я искал (хотя Матье ответил до того, как я отредактировал вопрос, чтобы сделать его более конкретным, поэтому приношу извинения!).
getName()
вернется по копии? - person Matthieu M.   schedule 16.03.2011