“Плоские” многомерные массивы
int** ms;
ms = new int* [10];
for (int i = 0; i < 10; i++) {
ms = new int [10];
}
В данном примере создается массив из элементов типа int*, далее создается “куча” массивов из int-ов, которые в последствии “присобачиваются” к первому массиву из int*. Все одномерные элементы 2-х мерного массива хранятся в памяти беспорядочно (связаны только указателями). Все конечно хорошо, но мне нужен 2-х мерный массив, который занимает в памяти одну непрерывную область!!!
Как такое сделать???
Предположим, я хочу создать квадратный (прямоугольный) 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.
Самое простое:
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;
Никогда не прокатит!!! При таком подходе компилятор (программа) не знает кол-во столбцов и строк в массиве, а без этого невозможно вычислить адрес элемента!!!
Что касается “my_arr = new int[10*10];” это понятно, но тут проблема с расчетом адреса.
Ну, так в чем проблема-то? Напиши собственный класс, который будет держать длину для каждой строки отдельно и транслировать обращение вида a[i, j] в соответствующее внутреннее представление.
int* my_arr;
my_arr = new int[10*10];
my_arr[j] = 0;
Никогда не прокатит!!!
конечно, что не прокатит. i, j не то что не инициализированы, но даже не объявлены :)
Напиши класс или структуру. Напр.
{
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);
};
};
...
...
my_arr[j] = 0;
А как получить j в “int* operator[] (int i)”??? Никогда с operator-ами не работал.
Огромное спасибо!
А как получить j в “int* operator[] (int i)”??? Никогда с operator-ами не работал.
Если речь была о динамических массивах, так в MFC класс есть такой. Как-то типа Array называется. Точнее не помню давно это было.
Огромное спасибо!
А как получить j в “int* operator[] (int i)”??? Никогда с operator-ами не работал.
один к одному.
оператор [](int i) возвращает указатель на my_arr[0]. К этому указателью автоматически добавляется значение j.
один к одному.
оператор [](int i) возвращает указатель на my_arr[0]. К этому указателью автоматически добавляется значение j.
А если я хочу создать линейный 3-х мерный массив, то придется получать 2 параметра. Как такое описать???
А если я хочу создать линейный 3-х мерный массив, то придется получать 2 параметра. Как такое описать???
Незнаю как можно переопределить два [][]. Скорей всего никак.
Можно переопределить функтор ()
{
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;
А если я хочу создать линейный 3-х мерный массив, то придется получать 2 параметра. Как такое описать???
В С++ в MFC есть специальный класс для работы с многомерными массивами переменной размерности
Если я не ошибаюсь, то он называется Array.
В С++ в MFC есть специальный класс для работы с многомерными массивами переменной размерности
Если я не ошибаюсь, то он называется Array.
А кто сказал, что я вообще под Выньдос... :P
А кто сказал, что я вообще под Выньдос... :P
Ты случайно не Пингвин?
Я Чертик например, а винды это чтоб жизнь медом не казалась. Производственная т.с. необходимость.
Предположим, я хочу создать квадратный (прямоугольный) 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> >
Я видимо упустил что-то важное...
Почему нельзя просто использовать
std::vector< std::vector<int> >
Важен не только результат, но и процесс...