двумерные массивы с разной длинной строк
Если используется 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.
Создаваться новые строки должны оператором new как я помню, ну и естественно, на длинну и количество строк должны налагаться ограничения, но только некоторые строки должны иметь меньшую длинну.
Хм... помнится я видел как это очень просто реализовано и без STL.
Создаваться новые строки должны оператором new как я помню, ну и естественно, на длинну и количество строк должны налагаться ограничения, но только некоторые строки должны иметь меньшую длинну.
pp[0] = new int[25]; // строка 0 содержит 25 intов
pp[1] = new int[78]; // строка 1 содержит 78 intов
// присвоим 123 последнему элементу строки 1
pp[1][77] = 123;
pp[0] = new int[25]; // строка 0 содержит 25 intов
pp[1] = new int[78]; // строка 1 содержит 78 intов
// присвоим 123 последнему элементу строки 1
pp[1][77] = 123;
Ну ещё получается нужен массив, чтоб "помнить" о размерности подмассивов. Причем это будет разделением сущности, в результате получим геморой при операциях с подмассивами (перемещение, удаление и т.п.), т.к. единственная связь - это индекс, а работать синхронно с двумя массивами всегда сложнее, чем с одним массивом.
Ну ещё получается нужен массив, чтоб "помнить" о размерности подмассивов. Причем это будет разделением сущности, в результате получим геморой при операциях с подмассивами (перемещение, удаление и т.п.), т.к. единственная связь - это индекс, а работать синхронно с двумя массивами всегда сложнее, чем с одним массивом.
Green, это вы не по теме. Тогда я тоже отвечу не по теме :)
Вопрос был можно ли сделать "матрицу" с переменным количеством элементов в строках. Ответ: можно, и я показал как это сделать средствами C.
Скажу честно, мне за всю свою жизнь ни разу не встретилась задача, которую я решил бы подобным образом. Полагаю однако, что если уж человек работает с таким массивом, то у него есть на то резоны и он уж во всяком случае знает длину каждой строки "матрицы".
Можно также избежать и "разделения сущностей". Хранить длины в любом случае где-то надо. Просто в std::vector они уже внутри вектора, ну а в "моём" случае их можно хранить, например, в первом элементе каждой строки. Ну, а уж если сделать из этого класс... однако, я размечтался. Вопрос-то был про plain C, так что никаких классов и std::*.
PS насчёт геморроя: честно говоря, всё программирование — геморрой. Однако, многим нравится. Мазохисты :-?:D:D
Green, это вы не по теме. Тогда я тоже отвечу не по теме :)
Вопрос был можно ли сделать "матрицу" с переменным количеством элементов в строках.
Вопрос был:
"как это правильно можно осуществить?"
IMHO
pp[0] = new int[25]; // строка 0 содержит 25 intов
НЕПРАВИЛЬНО
Полагаю однако, что если уж человек работает с таким массивом, то у него есть на то резоны и он уж во всяком случае знает длину каждой строки "матрицы".
Полагаю обратное.
Ну, а уж если сделать из этого класс...
... то мы плавно приближаемся к std::vector :)
Для NetSlow:
Тебе подсказали правильный путь через std::vector.
Единственное, VasAlVit пример привел некорректный, но, думаю, ты разберешься.