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

Ваш аккаунт

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

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

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

двумерные массивы с разной длинной строк

8.0K
29 мая 2005 года
NetSlow
18 / / 28.02.2005
Я как-то видел тему посвященную созданию двумерных массивов с произвольной длинной строк, а найти теперь не могу. Может тогда кто подскажет как это правильно можно осуществить?
4.3K
30 мая 2005 года
VasAlVit
33 / / 03.09.2004
В чистом C/C++ двумерные массивы с разной длинной строки реализовать нельзя (вернее можно, но в качестве длинны строки нужно использовать максимально возможный размер, или самому выделять память).
Если используется STL то двумерный массив с разной длинной строки можно записать так:

#include <vector>
typedef std::vector< std::vector< MyType > > MyArray;
MyArray array;

Тогда элемент в i-ой строке, j-ом столбце можно использовать так:

array[j] = ...;
... = array[j];

Добавить новую строку так:

array.push_back( std::vector< MyType > () );

Добавить элемент в i-ю строку так:

array.push_back( MyType() );

и т.д. Полный список действий нужно смотреть в справке по std::vector.
8.0K
30 мая 2005 года
NetSlow
18 / / 28.02.2005
Хм... помнится я видел как это очень просто реализовано и без STL.
Создаваться новые строки должны оператором new как я помню, ну и естественно, на длинну и количество строк должны налагаться ограничения, но только некоторые строки должны иметь меньшую длинну.
425
30 мая 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by NetSlow
Хм... помнится я видел как это очень просто реализовано и без STL.
Создаваться новые строки должны оператором new как я помню, ну и естественно, на длинну и количество строк должны налагаться ограничения, но только некоторые строки должны иметь меньшую длинну.

 
Код:
int** pp = new int*[2];
pp[0] = new int[25];  // строка 0 содержит 25 intов
pp[1] = new int[78];  // строка 1 содержит 78 intов
// присвоим 123 последнему элементу строки 1
pp[1][77] = 123;
;)
3
30 мая 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by sq_deep
 
Код:
int** pp = new int*[2];
pp[0] = new int[25];  // строка 0 содержит 25 intов
pp[1] = new int[78];  // строка 1 содержит 78 intов
// присвоим 123 последнему элементу строки 1
pp[1][77] = 123;
;)



Ну ещё получается нужен массив, чтоб "помнить" о размерности подмассивов. Причем это будет разделением сущности, в результате получим геморой при операциях с подмассивами (перемещение, удаление и т.п.), т.к. единственная связь - это индекс, а работать синхронно с двумя массивами всегда сложнее, чем с одним массивом.

425
31 мая 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Green
Ну ещё получается нужен массив, чтоб "помнить" о размерности подмассивов. Причем это будет разделением сущности, в результате получим геморой при операциях с подмассивами (перемещение, удаление и т.п.), т.к. единственная связь - это индекс, а работать синхронно с двумя массивами всегда сложнее, чем с одним массивом.

Green, это вы не по теме. Тогда я тоже отвечу не по теме :)

Вопрос был можно ли сделать "матрицу" с переменным количеством элементов в строках. Ответ: можно, и я показал как это сделать средствами C.

Скажу честно, мне за всю свою жизнь ни разу не встретилась задача, которую я решил бы подобным образом. Полагаю однако, что если уж человек работает с таким массивом, то у него есть на то резоны и он уж во всяком случае знает длину каждой строки "матрицы".

Можно также избежать и "разделения сущностей". Хранить длины в любом случае где-то надо. Просто в std::vector они уже внутри вектора, ну а в "моём" случае их можно хранить, например, в первом элементе каждой строки. Ну, а уж если сделать из этого класс... однако, я размечтался. Вопрос-то был про plain C, так что никаких классов и std::*.

PS насчёт геморроя: честно говоря, всё программирование — геморрой. Однако, многим нравится. Мазохисты :-?:D:D

3
31 мая 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by sq_deep
Green, это вы не по теме. Тогда я тоже отвечу не по теме :)

Вопрос был можно ли сделать "матрицу" с переменным количеством элементов в строках.



Вопрос был:
"как это правильно можно осуществить?"

IMHO

 
Код:
int** pp = new int*[2];
pp[0] = new int[25];  // строка 0 содержит 25 intов

НЕПРАВИЛЬНО

Цитата:
Originally posted by sq_deep
Полагаю однако, что если уж человек работает с таким массивом, то у него есть на то резоны и он уж во всяком случае знает длину каждой строки "матрицы".


Полагаю обратное.

Цитата:
Originally posted by sq_deep
Ну, а уж если сделать из этого класс...


... то мы плавно приближаемся к std::vector :)

Для NetSlow:
Тебе подсказали правильный путь через std::vector.
Единственное, VasAlVit пример привел некорректный, но, думаю, ты разберешься.

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