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.