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];
}
|
|