Pers.narod.ru. Алгоритмы. Класс "паскалевских" массивов на C++ |
Если Вы не забыли, в стандартных массивах Паскаля элементы можно нумеровать любыми идущими подряд целыми числами, скажем,
var a: array [-5..5] of real;
- вполне законный массив, состоящий из 11 элементов a[-5], a[-4], ..., a[5]
На C++ подобного результата легко достигнуть, написав небольшой класс.
Свойства low
и hi
будут хранить нижний и верхний индексы массива соответственно, а
вещественный массив value
будет содержать значения элементов массива.
Конструктор с единственным параметром - размерностью
(array::array (int n)
)
создаст массив с принятой по умолчанию нумерацией элементов с нуля. Если вызвать конструктор с 2 целыми параметрами (нижний и верхний индексы массива), то
можно нумеровать элементы произвольными подряд идущими числами как в Паскале.
Чтобы работало обращение к элементам такого массива, нужно переопределить оператор индекса []
.
Переопределённый оператор []
возвращает значение MAXFLOAT
, если передан недопустимый номер элемента.
Тип возвращаемого значения выбран float &
, чтобы избежать проблем и сообщений об Lvalue required
при работе с элементами класса-массива как слева, так и справа от знака =
.
Пример нетрудно расширить для работы, скажем, с ассоциативными массивами, имеющими
произвольные, в том числе строковые, ключи.
Как минимум, нам придётся добавить в класс массив для хранения произвольных ключей:
char **key;
, где key[i]
будет хранить очередной ключ.
Листинг и тест примера:
#include <iostream.h> #include <values.h> class array { private: int low,hi; float *value; public: array() : low(0), hi(0), value(NULL) {} array(int); array(int,int); ~array(); float & operator [] (int); }; array::array (int n) { new array (0,n-1); } array::array (int k1, int k2) { low=k1; hi=k2; value = new float [k2-k1+1]; } array::~array () { delete value; } float & array::operator [] (int k) { float *r; *r=MAXFLOAT; if (k<low || k>hi) return *r; return value[k-low]; } void main () { array pascal_array(-5,5); for (int i=-5; i<=5; i++) { pascal_array[i]=i+5; cout << "\nKey=" << i << ", value=" << pascal_array[i]; } pascal_array[-5]=pascal_array[5]; cout << "\nItem -5 changed=" << pascal_array[-5]; cout << "\nKey=-10 (bad), value=" << pascal_array[-10]; }
гостевая; E-mail |