Предположим, что значения ключей - отдельные небольшие числа. В этом случае простейший алгоритм поиска основывается на сохранении элементов в массиве, индексированном по ключам.

template <class Item, class Key>
class ST {
private:
Item nullItem, *st;
int M;
public:
ST(int maxN)
{ M = nullItem.key(); st = new Item[M]; }
int count()
{ int N = 0;
for(int i = 0; i < M; i++)
if(!st[i].null()) N++;
return N;
}
void insert(Item x)
{ st[x.key()] = x; }
Item search(Key v)
{return st[v];}
void remove(Item x)
{st[x.key()] = nullItem; }
Item select(int k)
{for(int i = 0; i < M; i++)
if(!st[i].null())
if(k-- == 0) return st[i];
return nullItem;
}
void show(ostream& os)
{ for(int i = 0; i < M; i++)
if(!st[i].null()) st[i].show(os); }
};

Оператор new[] инициализирует все записи значением nullItem, затем мы вставляем (insert) элемент со значением ключа k, просто сохраняя его в массиве st[k], и выполняем поиск (search) элемента со значением ключа k, отыскивая его в st[k]. Для удаления (remove) элемента со значением ключа k значение nullItem помещается в st[k]. Реализация операций выбора (select), сортировки (sort) и подсчёта (count) в программе использует линейный просмотр массива с пропуском нулевых элементов. Реализация предоставляет клиенту решать задачи обработки элементов с дублированными ключами и проверки таких условий, как указание операции remove для ключа, отсутствующего в таблице.