С Boost.Foreach вы в значительной степени застряли со ссылкой на разыменованный итератор, поскольку это то, для чего предназначено Boost.Foreach: упростить доступ к элементам в диапазоне. Однако, если вы просто ищете один элемент, который соответствует критериям, вы можете попробовать std::find_if()
:
struct criteria {
template <class T>
bool operator()(T const & element) const {
return (element /* apply criteria... */)? true : false;
}
};
// somewhere else
List::iterator savedIterator =
std::find_if(list.begin(), list.end(), criteria());
Похоже, что вы хотите применить операции ко всему списку - в этом случае я бы предложил использовать что-то вроде std::min_element()
или std::max_element()
вместе с Boost.Iterators, например boost::transform_iterator
.
struct transformation {
typedef int result_type;
template <class T>
int operator()(T const & element) const {
// stuff
int result = 1;
if (condition) result = 0;
// more stuff
return result;
}
};
// somewhere else
List::iterator savedIterator =
std::min_element(
boost::make_transform_iterator(list.begin(), transformation()),
boost::make_transform_iterator(list.end(), transformation()),
).base();