![]() |
|
Модераторы: bsa |
![]()
|
|
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
Как максимально быстро создать многомерные вектор.
скажем имеем массив, double a[4][4]={ {1,3,6,1}, {3,5,1,4}, {5,2,4,5}, {1,2,3,4} }; нужно получить vector < vector<double> >va; кол-во элементов массива "a" неизвестно Добавлено через 5 минут и 9 секунд ес-но с циклами не лучший вариант. тк. массив может иметь разный уровень вложенности, заранее неизвестный. |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
в общем случае (надо проверить) можно сделать vector.resize(sizeof(a)/sizeof(a[0])) и сделать memcpy в &vector.front() ..... возможно элменты встанут "не туда"... в общем надо проверять.... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
чёт не вышло. вывело 0.0 Это сообщение отредактировал(а) Тигер - 4.4.2010, 23:01 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
если нужна квадратная матрица, то проще сделать 1 вектор, и обращаться к элементам как
m[x+cx*y] |
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
не обязательно квадратная. уровень вложенности может быть разным.
может рекурсивный конструктор написать? я пробовал, у меня не получилось. Добавлено @ 07:44 не знаю как узнать уровень вложенности
Это сообщение отредактировал(а) Тигер - 5.4.2010, 07:47 |
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
как проверить переменную на массив. или получить уровень вложенности Это сообщение отредактировал(а) Тигер - 5.4.2010, 14:13 |
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
ругается не понятно поч. Это сообщение отредактировал(а) Тигер - 5.4.2010, 14:42 |
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
сделал через Ж.
оказалось что void* нельзя разименовывать. капец. |
|||
|
||||
| Ozerich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 2.8.2009 Где: Минск, Беларусь Репутация: 4 Всего: 5 |
Конечно нельзя. А откуда компилятор знает сколько место занимают данные которые там лежат? --------------------
C++(STL) / DHTML(CSS) / Javascript / PHP Developer |
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
а как уже кроме void* можно получить произвольной вложенности vector<vector>
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Тигер, через одномерный массив. Т.е. ты хранишь два одномерных массива: размерностей и данных. Доступ к каждому элементу через "вектор координат". Каждый элемент которого умножается на сумму размерностей ему предшествующих и суммируется с предыдущим умножением. В результате получаешь индекс в одномерном массиве.
|
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
алгоритм представил, но реализация видится велосипедной и неудобной. хотелось бы на чистом stl
как быть с общим интерфейсом? Это сообщение отредактировал(а) Тигер - 6.4.2010, 18:02 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Тигер, не понял, а что в ней велосипедного?
|
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
велосипедная наверное грубо. но это обёртка над stl, которая и так обёртка над стандартными возможностями.
хотя мб в СИ такая избыточность нормальна? ну и не понятно как будет с остальным интерфейсом вектора. к примеру, надо будет мне это
придётся значит переписывать метод size() Это сообщение отредактировал(а) Тигер - 8.4.2010, 00:20 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Тигер, начнем с того, что это не будет работать с приведенным мной примером, так как у меня оператора [] получающего на входе целое нет - его придется тебе самому писать. Не говоря уже о конструкторе.
Ты пытаешься создать свой собственный контейнер. Ты можешь использовать вектор, а можешь и не использовать. Это твое право. И никакой избыточности тут нет. |
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
мне интересно как делают это в крупных проектах.
есть же много вещей где может понадобится статичная инициализация многомерного массива. например массив конфигураций |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
не это ли Вы ищете : http://codepad.org/Hk2dv5iu |
|||
|
||||
| Тигер |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 4.4.2010 Репутация: нет Всего: нет |
о нет =)
а если 10 урвней? Добавлено через 57 секунд лучше уж вручную уровень вложенности передвать. хотя я уверен есть способ его вычислить |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
не могли бы еще раз сформулировать задачу, чтоб понятно было чего Вам надо..
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
если требуется вычислить уровень вложенности, чем прошлый пример не подошел ? вот на его основе : http://codepad.org/SSwAz5c9 Добавлено через 3 минуты и 9 секунд составляете общие функции переходники - типа библиотечки - а потом на их основе делаете что нужно.. пример показывал как узнать размерность, а уж к какому виду вы хотите привести полученную информацию, Вам решать .. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |