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

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz