2016-05-16 6 views
0

У меня есть один одномерный массив
Лечить одномерный массив в двумерный

int* a = new int[n * m]; 

и мне нужно, чтобы рассматривать его как двумерная т.е.

a[i][j] = a[n * i + j] 

Я попытался играть вокруг с помощью директив и googled много. Но для меня ничего не работало.
Есть ли способ сделать это? Smt. как define a[i][j] a[n * i + j]?
Спасибо.

+0

Я думаю, что у вас есть поиск не так много http://stackoverflow.com/questions/7492842/convert-one-dimensional-arrary-to-two-dimensional-in-c –

+0

Любые 'array_view' или пробелы GSL 'class, должен иметь возможность сделать это, не изменяя ничего о самом массиве. – chris

+0

Я предполагаю, что у вас есть только одно выделение, потому что вы хотите, чтобы данные были смежными? –

ответ

1

Поскольку вы программируете на C++ можно создать обертку-класс, который хранит массив, и иметь operator[] функцию, которая возвращает прокси-объект, operator[] функция выполняет вычисление n * i + j и возвращает ссылку на нужный элемент.

В качестве альтернативы вы можете создать встроенную функцию или макрос функции, который принимает массив и индексы в качестве аргументов и возвращает элемент.

Но без хаков, таких как класс Sams answer классов-оболочек, нет способа получить «истинный» массив массивов, как вы хотите.

2

Вам необходимо определить второй массив, содержащий указатели. Что-то вроде этого:

int **b=new int *[m]; 

for (int i=0; i<m; ++i) 
    b[i]=&a[i*n]; 

После этого b[i][j] будет относиться к a[n*i+j].

+0

Хотя это возможное решение, у него есть некоторые проблемы, которые не существует в одном «массиве», в основном в отношении локализации и кэширования процессора. –

+0

Я не хочу выделять массив указателей, а затем каждый выделяет память для каждого указателя. Я просто хочу подставить 'a [i] [j] = a [n * i + j]' –

+0

@T_Igor Обратите внимание, что код в ответе фактически не делает то, что вы думаете. Цикл не выделяет память, просто назначение. –

 Смежные вопросы

  • Нет связанных вопросов^_^