Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

“Плоские” многомерные массивы

4.1K
06 декабря 2004 года
sonjia
38 / / 06.04.2004
Предположим, я хочу создать квадратный (прямоугольный) 2-х мерный массив:
int** ms;
ms = new int* [10];
for (int i = 0; i < 10; i++) {
ms = new int [10];
}
В данном примере создается массив из элементов типа int*, далее создается “куча” массивов из int-ов, которые в последствии “присобачиваются” к первому массиву из int*. Все одномерные элементы 2-х мерного массива хранятся в памяти беспорядочно (связаны только указателями). Все конечно хорошо, но мне нужен 2-х мерный массив, который занимает в памяти одну непрерывную область!!!
Как такое сделать???
259
06 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by sonjia
Предположим, я хочу создать квадратный (прямоугольный) 2-х мерный массив:
int** ms;
ms = new int* [10];
for (int i = 0; i < 10; i++) {
ms = new int [10];
}
В данном примере создается массив из элементов типа int*, далее создается “куча” массивов из int-ов, которые в последствии “присобачиваются” к первому массиву из int*. Все одномерные элементы 2-х мерного массива хранятся в памяти беспорядочно (связаны только указателями). Все конечно хорошо, но мне нужен 2-х мерный массив, который занимает в памяти одну непрерывную область!!!
Как такое сделать???



Самое простое:

int my_arr[10][10];

или:
int* my_arr;
my_arr = new int[10*10];
//а индексы можно и самому пересчитать по формуле my_arr[i,j] == my_arr+i*10+j синтаксис не строгий это для иллюстрации идеи, опять-же и my_arr[j] должно прокатить в этом случае, это есть в ANSI.

4.1K
06 декабря 2004 года
sonjia
38 / / 06.04.2004
Цитата:
Originally posted by AlexandrVSmirno


Самое простое:

int my_arr[10][10];

или:
int* my_arr;
my_arr = new int[10*10];
//а индексы можно и самому пересчитать по формуле my_arr[i,j] == my_arr+i*10+j синтаксис не строгий это для иллюстрации идеи, опять-же и my_arr[j] должно прокатить в этом случае, это есть в ANSI.



Самое простое не самое эффективное!!! Размеры массива я заранее не знаю.
Что касается “my_arr = new int[10*10];” это понятно, но тут проблема с расчетом адреса. Хотелось бы массив в непрерывной области с обращением к элементу по старинке “my_arr[j]”!!!

P.S.
int* my_arr;
my_arr = new int[10*10];
my_arr[j] = 0;
Никогда не прокатит!!! При таком подходе компилятор (программа) не знает кол-во столбцов и строк в массиве, а без этого невозможно вычислить адрес элемента!!!

10
06 декабря 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by sonjia
Что касается “my_arr = new int[10*10];” это понятно, но тут проблема с расчетом адреса.


Ну, так в чем проблема-то? Напиши собственный класс, который будет держать длину для каждой строки отдельно и транслировать обращение вида a[i, j] в соответствующее внутреннее представление.

368
06 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by sonjia
int* my_arr;
my_arr = new int[10*10];
my_arr[j] = 0;
Никогда не прокатит!!!


конечно, что не прокатит. i, j не то что не инициализированы, но даже не объявлены :)

Напиши класс или структуру. Напр.

Код:
struct T
{
  int row;
  int col;
  int *p;
  T(int in_row, int in_col)
  {
    row = in_row;
    col = in_col;
    p = new int[row*col];
  };
  ~T()
  {
    if(p!=NULL){delete p; p = NULL;}
  };
  int* operator[](int i)
  {
    return (p + i*col);
  };
};
тогда можно написать
 
Код:
T my_arr(10,10);
...
...
my_arr[j] = 0;
4.1K
07 декабря 2004 года
sonjia
38 / / 06.04.2004
Огромное спасибо!
А как получить j в “int* operator[] (int i)”??? Никогда с operator-ами не работал.
259
07 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by sonjia
Огромное спасибо!
А как получить j в “int* operator[] (int i)”??? Никогда с operator-ами не работал.



Если речь была о динамических массивах, так в MFC класс есть такой. Как-то типа Array называется. Точнее не помню давно это было.

368
07 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by sonjia
Огромное спасибо!
А как получить j в “int* operator[] (int i)”??? Никогда с operator-ами не работал.


один к одному.

оператор [](int i) возвращает указатель на my_arr[0]. К этому указателью автоматически добавляется значение j.

4.1K
07 декабря 2004 года
sonjia
38 / / 06.04.2004
Цитата:
Originally posted by rostyslav

один к одному.

оператор [](int i) возвращает указатель на my_arr[0]. К этому указателью автоматически добавляется значение j.


А если я хочу создать линейный 3-х мерный массив, то придется получать 2 параметра. Как такое описать???

368
07 декабря 2004 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by sonjia

А если я хочу создать линейный 3-х мерный массив, то придется получать 2 параметра. Как такое описать???


Незнаю как можно переопределить два [][]. Скорей всего никак.

Можно переопределить функтор ()

Код:
struct Z
{
  int icnt;
  int jcnt;
  int kcnt;
  int *p;
  Z(int in_i, int in_j, int in_k):
    icnt(in_i),jcnt(in_j),kcnt(in_k)
  {
    p = new int[icnt*jcnt*kcnt];
  };
  ~Z()
  {
    if(p!=NULL){delete p; p=NULL;}
  };
  inline int& operator()(int i, int j, int k)
  {
    return p[i*jcnt*kcnt + j*kcnt + k];
  };
  inline int operator()(int i, int j, int k) const
  {
    return *(p + i*jcnt*kcnt + j*kcnt + k);
  };
};

Z a(10,10,10);

a(3,4,5)=8;
259
07 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by sonjia

А если я хочу создать линейный 3-х мерный массив, то придется получать 2 параметра. Как такое описать???



В С++ в MFC есть специальный класс для работы с многомерными массивами переменной размерности
Если я не ошибаюсь, то он называется Array.

4.1K
07 декабря 2004 года
sonjia
38 / / 06.04.2004
Цитата:
Originally posted by AlexandrVSmirno


В С++ в MFC есть специальный класс для работы с многомерными массивами переменной размерности
Если я не ошибаюсь, то он называется Array.


А кто сказал, что я вообще под Выньдос... :P

259
07 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by sonjia

А кто сказал, что я вообще под Выньдос... :P



Ты случайно не Пингвин?
Я Чертик например, а винды это чтоб жизнь медом не казалась. Производственная т.с. необходимость.

3
07 декабря 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by sonjia
Предположим, я хочу создать квадратный (прямоугольный) 2-х мерный массив:
int** ms;
ms = new int* [10];
for (int i = 0; i < 10; i++) {
ms = new int [10];
}
В данном примере создается массив из элементов типа int*, далее создается “куча” массивов из int-ов, которые в последствии “присобачиваются” к первому массиву из int*. Все одномерные элементы 2-х мерного массива хранятся в памяти беспорядочно (связаны только указателями). Все конечно хорошо, но мне нужен 2-х мерный массив, который занимает в памяти одну непрерывную область!!!
Как такое сделать???



Я видимо упустил что-то важное...
Почему нельзя просто использовать
std::vector< std::vector<int> >

4.1K
07 декабря 2004 года
sonjia
38 / / 06.04.2004
Цитата:
Originally posted by Green


Я видимо упустил что-то важное...
Почему нельзя просто использовать
std::vector< std::vector<int> >


Важен не только результат, но и процесс...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог