# STLAlgorithmExtensions/IndexAlgorithms

BOOST WIKI | STLAlgorithmExtensions | RecentChanges | Preferences | Page List | Links List

All of the algorithms below find some indices in a container. As I remember, they all were usefull some time ago, but don't ask me why iterators won't do. I don't remember. Probably, because iterators are not stable, or for some other reason.

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());

BOOST WIKI | STLAlgorithmExtensions | RecentChanges | Preferences | Page List | Links List