2014-09-23 2 views
0

У меня есть 2-мерный массив, элементы которого я обычно хочу, чтобы получить доступ, как это:элементов доступа из 2D массива с абсолютным элементом числом

val = my_array[row][col]; 

Но я также должен получить доступ к элементам, используя их абсолютный индекс времени на время, когда строка и столбец не известны. «Абсолютный» индекс данного элемента может быть вычислен следующим образом:

abs_idx = row*numCols + col; 

Я имею в виде достижения этой цели следующим образом

mydatatype *my_array_abs = new mydatatype[numRows*numCols]; 
mydatatype **my_array = new mydatatype*[numRows]; 
for (int ii=0; ii<numRows; ii++) 
{ 
    my_array[ii] = &my_array_abs[ii*numCols]; 
} 

Является ли это подходящий способ для достижения своей цели, или я должен ожидать столкнуться с любыми проблемами или неэффективностью?

+0

Кроме того, необходимо выделить память для 'my_array'. –

+0

Простите меня, но я не вижу в вашем опубликованном коде, что вы выделили память 'my_array'. –

+0

@Learner Вы абсолютно правы. Я отозвал свой комментарий после того, как понял, что вы говорите. Я не обратил на это внимания. Выбросив некоторый пример кода, я не думал, что эта часть проходит весь путь. Спасибо что подметил это. – nispio

ответ

1

Чтобы достичь того, чего вы хотите, вы должны изменить строку:

mydatatype *my_array; 

To:

mydatatype **my_array = new mydatatype*[numRows] ; 

Примечание: Я вижу только одну проблему с этим подходом, что вы требовали непрерывный кусок памяти. В противном случае ваш подход прекрасен.

+0

Да. Я упустил из виду тот факт, что мне нужно было выделить пространство для этих указателей, даже если они относятся к уже выделенной памяти. У меня возникает соблазн исправить это исправление в моем вопросе, хотя цель моего вопроса состояла в том, что это был эффективный способ сделать это, а не * как * сделать это. – nispio

+0

Если память не является проблемой для вас, тогда этот подход определенно эффективен, потому что у вас есть непрерывная память. И доступ к непрерывной памяти быстрее, чем несмежная память. –

1

Я был бы соблазн использовать зЬй :: вектор, чтобы избежать всех опасностей сырых массивов:

#include <vector> 
#include <iostream> 
typedef int mydatatype; 
typedef std::vector<std::vector<mydatatype> > myvectortype; 

int numCols = 10; 
int numRows = 100; 

mydatatype& at_absolute(myvectortype& v, int index) { 
    return v[index/numRows][index % numRows]; 
} 

int main() { 
    myvectortype my_array(numRows, std::vector<mydatatype>(numCols, 0)); 

    my_array[1][2] = 31; 
    std::cout << at_absolute(my_array, 102) << '\n'; 
} 
+0

Мне нравится идея, но кажется, что она может быть менее эффективной, потому что каждая операция доступа к массиву требует дополнительных двух операций деления. Есть предположения? Думаю, я должен упомянуть, что эффективность имеет решающее значение, потому что я внедряю систему DSP в реальном времени, поэтому я хочу по возможности сбрить MIPS. – nispio

+0

Я предполагаю, что один размерный массив может быть более эффективным, с функцией доступа «at_row_col» (вероятно, имеет смысл также). – robert

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