Товарищи, подскажите, пожалуйста как организовать в программе матрицу произвольного размера?
Поясню. В STL есть контейнер vector, Он может изменять свой размер по мере выполнения программы. И задавать этот самый размер тоже можно во время работы. Хотелось бы подобного и для матрицы.
Для чего это нужно? Просто мне неизвестна размерность матрицы, которая будет входным параметром. А хочется гибкости. Если есть другие варианты, то с удовольствием выслушаю предложения.
Здравствуйте Хитрик Денис, Вы писали:
ХД>Товарищи, подскажите, пожалуйста как организовать в программе матрицу произвольного размера?
ХД>Поясню. В STL есть контейнер vector, Он может изменять свой размер по мере выполнения программы. И задавать этот самый размер тоже можно во время работы. Хотелось бы подобного и для матрицы.
ХД>Для чего это нужно? Просто мне неизвестна размерность матрицы, которая будет входным параметром. А хочется гибкости. Если есть другие варианты, то с удовольствием выслушаю предложения.
Посмотри сюда http://www.sgi.com/tech/stl/other_resources.html — там много чего, но первой строчкой идет The Matrix Template Library. Я ей лично не пользовался, но когда то заглядывал. Это вроде как раз расширение STL для работы с матрицами и векторами, в математическом понимании.
Здравствуйте Хитрик Денис, Вы писали:
ХД>Товарищи, подскажите, пожалуйста как организовать в программе матрицу произвольного размера?
ХД>Поясню. В STL есть контейнер vector, Он может изменять свой размер по мере выполнения программы. И задавать этот самый размер тоже можно во время работы. Хотелось бы подобного и для матрицы.
ХД>Для чего это нужно? Просто мне неизвестна размерность матрицы, которая будет входным параметром. А хочется гибкости. Если есть другие варианты, то с удовольствием выслушаю предложения.
[лирическое отступление] вместо std::vector почти всегда лучше использовать std::deque. Он тоже имеет константное время доступа к произвольным элементам, но у него существенно быстрее добавление в конец.
а vector<vector<double>> или deque<deque<double>> чем не устраивает?
Действительно, на сайт SGI я не заглядывал даже, но всё же мне нужен был именно второй вариант. Просто самому жо него дойти помешали слабые познания в C/C++ программировании (надеюсь на развитие оных).
Теперь вопрос состоит в следующем: Как матрицу, заданную как deque< deque< int > >, заполнить? Ведь к несуществующим элементам нельзя обратиться через операцию индексирования [], выдаёт Access violation :-(
(поэтому-то я и задал первый вопрос -- помня TP7 пропробовал заполнить матрицу через индексы -- MyMatrix[i][j])
Нужно ли использовать в данном случае промежуточный дек deque< int >, заполнить его через .push_back, апотом через тот же .push_back засовывать всю строчку целиком в deque< deque< int > >?
Кстати, по мере прочтения документации возникла идея. Когда я узнаЮ размеры требуемой матрицы...
deque< deque< int > > MyMatrix; // Объявили переменную
cin >> N >> M;
// Вот я узнал размеры матрицы -- NxM
// И делаю следующее
MyMatrix.resize( N ); // Определяю количество строк
for (int i = 0; i < MyMatrix.size(); i++) MyMatrix[ i ].resize(M); // Для каждой строчки -- кол-во столбцов
Как такой вариант? В стиле STL? Или есть что-то попроще?
Здравствуйте retalik, Вы писали:
R>[лирическое отступление] вместо std::vector почти всегда лучше использовать std::deque. Он тоже имеет константное время доступа к произвольным элементам, но у него существенно быстрее добавление в конец.
Можно об этом поподробнее?
R>а vector<vector<double>> или deque<deque<double>> чем не устраивает?
Теперь, когда понял ошибку, эти варианты устраивают.
Здравствуйте Хитрик Денис, Вы писали:
ХД>Здравствуйте retalik, Вы писали:
R>>[лирическое отступление] вместо std::vector почти всегда лучше использовать std::deque. Он тоже имеет константное время доступа к произвольным элементам, но у него существенно быстрее добавление в конец.
ХД>Можно об этом поподробнее?
Ну, например, вот цитата:
>deque — вид последовательности, которая, подобно вектору, поддерживает итераторы произвольного доступа. Кроме того она поддерживает операции вставки и стирания в начале или в конце за постоянное время; вставка и стирание в середине занимают линейное время. Как с векторами, управление памятью обрабатывается автоматически.
Насколько помню, по скорости произвольного доступа deque проигрывает вектору какие-то мелкие проценты, но у вектора линейное время добавления в конец (если нет резервного места). Зато вектор позволяет обращаться к элементам как к непрерывной области памяти (это какой-то комментарий к C++ Standard был).
R>>а vector<vector<double>> или deque<deque<double>> чем не устраивает? ХД>Теперь, когда понял ошибку, эти варианты устраивают.
Если одна размерность более стабильная, можно даже что-то типа vector<deque<>> :)
ОК Спасибо
R>Насколько помню, по скорости произвольного доступа deque проигрывает вектору какие-то мелкие проценты, но у вектора линейное время добавления в конец (если нет резервного места). Зато вектор позволяет обращаться к элементам как к непрерывной области памяти (это какой-то комментарий к C++ Standard был). R>Если одна размерность более стабильная, можно даже что-то типа vector<deque<>> :)
Всё понятно. Тогда мне больше подойдёт vector<vector<>>. Так как мне нужно было лишь получить от пользователя размерность и потом построить матрицу этой размеронсти, а при использовании она свои размеры менять не будет.
R>А resize ты правильно делаешь.
Замечательно! Значит что-то понял :-)