Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.108.168] |
|
Сообщ.
#1
,
|
|
|
Всем хай! Сходу к делу!
Для условия мне нужно привести малый кусочек кода на С++(буквально 5 строк), его поймет даже 4рех летний ребенок): class Dyn_Matr { private: double** data; int n; int m; }; и в задании просят реализовать эффективный вариант индексирования, чтобы можно было присваивать объект[i][j] = значение -------------------------------------------------------- это задание одно из сложнейших считается, хм... я вот совсем не выкупаю следующее: по дефалту и так ведь можно обращаться по индексам к данным массива, динамическая память выделяет последовательные участки памяти, поиск по дефалту мгновенный. Что здесь можно эффективнее еще придумать?? ладно бы была разряженная матрица (аля данные в Excel), так ведь нет, все элементы массива всегда заполняются и пр. Что-то здесь нечисто! Подскажите, к чему стремится здесь, в чем может заключаться эффективизация доступа индексного? P.S. не думаю, что описание класса для динамической матрицы ошибочно, по-другому не бывает ведь) Добавлено еще такая была мысль: может фишка в том, чтобы обращаться именно через индексы через объект напрямую, минуя обращение к полю data, т е так: m[2][4] = 5 а, не m->data[2][4] = 5 но ведь С++ не допускает перегрузку двойных скобок [][], а только одинарных [] не знаю, может мысль неправильная совсем и надо в раздел С++ идти |
Сообщ.
#2
,
|
|
|
Возможно, имеется ввиду хранение массива не по строкам, а целиком одним непрерывным куском памяти. Реализовать его можно по-разному
1) Вычисляем индекс напрямую double *data; // Одномерный, а не двумерный массив, data = new double[n * m]; data[i * m + j] = 42; // Обращение к элементу [i][j] 2) Вместо смещений используем массив указателей на указатель: double *main_data = new double[n * m]; // Сами данные массива double **row_data = new double*[n]; for(int i = i; i < n; ++i) row_data[i] = main_data + i * m; row_data[i][j] = 42; // Индексируем как обычно // В деструкторе не забыть удалить оба буфера delete[] row_data; delete[] main_data; Добавлено Цитата FasterHarder @ но ведь С++ не допускает перегрузку двойных скобок [][], а только одинарных [] Есть два варианта 1) Юзай для индексации operator(). 2) Пусть operator [] возвращает какой-нибудь Column, у которого тоже есть operator[]. |