for i = 0 to size(v) - 1
v[0]; f(v[1..size(v) - 1])
v
and a value x
,
find x
in v
or indicate x
is not in v
v[0]
equals x
return 0v[1]
equals x
return 1v[n - 1]
equals x
return n - 1
-1
template <class RandomIterator, typename T> static RandomIterator lfind( RandomIterator start, RandomIterator end, const T & x) { while ((start < end) && (*start == x)) start++; return start; }
x
, you've found itx
in the rest of the vector
template <class RandomIterator, typename T> static RandomIterator rfind(RandomIterator start, RandomIterator end, const T & x) { if (start >= end) return end; if (*start == x) return start; return rfind(start + 1, end, x); }
v
, permute v so that if
i < j
, then v[i] < v[j]
template <typename RandomIterator> static void bubble(RandomIterator start, RandomIterator end) { while (start < end) { for (RandomIterator s = start + 1; s < end; s++) if (*(s - 1) > *s) swap(*(s - 1), *s); end--; } }
v[1..n-1]
is sorted; where does v[0] go?
template <typename T> static void insert(T * start, T * end) { if (start < end) { insert(start + 1, end); const T t = *start; T * s = start; while ((s < end - 1) && (*(s + 1) < t)) { *s = *(s + 1); s++; } *s = t; } }
i < j
then values[indices[i]] < values[indices[j]]
template <typename T> class fvector { public: void insert(const T & v) { values.push_back(v); indices.push_back(values.size() - 1); for (int i = values.size() - 1; (i > 0) && (values[indices[i - 1]] > values[indices[i]]); i--) { swap(values[indices[i - 1]], values[indices[i]]); swap(indices[i - 1], indices[i]); } } int find(const T & v) const { int l = -1; int r = values.size(); while (l < r - 1) { const int m = (l + r)/2; if (values[indices[m]] <= v) l = m; else r = m; } if ((l > -1) && (values[indices[l]] == v)) return indices[l]; else return -1; } private: vector<T> values; vector<int> indices; }; // fvector
This page last modified on 13 June 2000.