template<class Container, class T> inline typename Container::difference_type find_index(const Container &container, const T& value) { const typename Container::const_iterator i = find(container, value); if (i != container.end()) return distance(container.begin(), i); return -1; } template<class Container, class Predicate> inline typename Container::difference_type find_index_if(const Container &container, Predicate pred) { const typename Container::const_iterator i = find_if(container, pred); if (i != container.end()) return distance(container.begin(), i); return -1; } template<class InputIterator, class Predicate> std::vector<int> find_all_indices_if(InputIterator b, InputIterator e, Predicate pred) { std::vector<int> result; for (InputIterator i = b; i != e; i++) if (pred(*i)) result.push_back(distance(b, i)); return result; } template<class Container, class Predicate> inline std::vector<int> find_all_indices_if(Container &container, Predicate pred) { return find_all_indices_if(container.begin(), container.end(), pred); } template<class InputIterator, class T> inline std::vector<int> find_all_indices(InputIterator b, InputIterator e, const T &t) { return find_all_indices_if(b,e, bind2nd(std::equal_to<T> (), t)); } template<class Container, class T> inline std::vector<int> find_all_indices(Container &container, const T& t) { return find_all_indices(container.begin(), container.end(), t); }
One use case: if we use vector to implement int->something mapping (as often happens with BGL), then to do reverse lookup one can use
find_index(components, something(...))which is a lot more concise than
distance(find(components, something(...)), components.begin());