Существует еще одна альтернатива, которая является подходом, используемым STL C ++:
find(haystack.begin(), haystack.end(), needle)
Я думаю, что это отличный пример крика C ++ "в лицо!" в ООП. Идея состоит в том, что ООП не является какой-либо серебряной пулей; иногда вещи лучше всего описывать с точки зрения действий, иногда с точки зрения объектов, иногда ни одного, а иногда и того и другого.
Бьярн Страуструп сказал в TC ++ PL, что когда вы разрабатываете систему, вы должны стремиться отражать реальность в рамках ограничений эффективного и действенного кода. Для меня это означает, что вы никогда не должны следовать слепо. Подумайте о том, что у вас под рукой (стог сена, иголка), и о контексте, в котором мы находимся (поиск, в этом и состоит выражение).
Если упор делается на поиск, то используется алгоритм (действие), который делает упор на поиск (то есть гибко подходит для стогов сена, океанов, пустынь, связанных списков). Если акцент делается на стоге сена, инкапсулируйте метод find внутри объекта стога сена и т. Д.
Тем не менее, иногда вы сомневаетесь и вам трудно сделать выбор. В этом случае быть объектно-ориентированным. Если вы передумаете позже, я думаю, что легче извлечь действие из объекта, чем разделить действие на объекты и классы.
Следуйте этим рекомендациям, и ваш код будет более понятным и, в общем, красивее.