Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многомерный вектор 
:(
    Опции темы
Тигер
Дата 4.4.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 секунд
ес-но с циклами не лучший вариант.
тк. массив может иметь разный уровень вложенности, заранее неизвестный.
PM MAIL   Вверх
jonie
Дата 4.4.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата


кол-во элементов массива "a" неизвестно
в случае статического массива вполне известно.
в общем случае (надо проверить) можно сделать vector.resize(sizeof(a)/sizeof(a[0])) и сделать memcpy в &vector.front() .....
возможно элменты встанут "не туда"... в общем надо проверять....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Тигер
Дата 4.4.2010, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



Код

            vector< vector<double> > va;
    int size=sizeof(a)/sizeof(a[0]); 
    va.resize(size);
    memcpy(&va.front(),a,size+1);

    for(int i=0;i<va.size();i++){
        for(int j=0;j<va[i].size();i++){
            cout <<va[i][j]<<" ";
        }
        cout <<endl;
    }


чёт не вышло.
вывело 0.0

Это сообщение отредактировал(а) Тигер - 4.4.2010, 23:01
PM MAIL   Вверх
GoldFinch
Дата 4.4.2010, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



если нужна квадратная матрица, то проще сделать 1 вектор, и обращаться к элементам как
m[x+cx*y]
PM MAIL ICQ   Вверх
Тигер
Дата 5.4.2010, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



не обязательно квадратная. уровень вложенности может быть разным.

может рекурсивный конструктор написать? я пробовал, у меня не получилось.

Добавлено @ 07:44
не знаю как узнать уровень вложенности

Код

template<typename _T,typename _T2>
void vConstruct(_T &res,_T2 arr){
    int size=sizeof(arr)/sizeof(arr[0]);
    for(int i=0;i<size;i++){
        if(!arr[i][0]){
           res.push_back(arr[i]);       
        }else{
           
           vConstruct(arr[i],sizeof(arr[i])/sizeof(_T2));
        }
    }
}



Это сообщение отредактировал(а) Тигер - 5.4.2010, 07:47
PM MAIL   Вверх
Тигер
Дата 5.4.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



Код

template<typename _T>
void* vConstruct(_T &arr){
     int size=sizeof(arr)/sizeof(arr[0]);
     vector<_T> *res=new vector<_T>; 
     for(int i=0;i<size;i++){
         if(sizeof(arr[i])/sizeof(_T)==0){
             cout <<"no no ";
         }else{
             cout <<"ee ee ";
         }
     }
     return &res;
}



как проверить переменную на массив. или получить уровень вложенности

Это сообщение отредактировал(а) Тигер - 5.4.2010, 14:13
PM MAIL   Вверх
Тигер
Дата 5.4.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



Код

template<typename _T>
void* vConstruct(_T &arr,unsigned int level){
     int size=sizeof(arr)/sizeof(arr[0]);
     vector<void *> *res=new vector<void *>; 
     for(int i=0;i<size;i++){
         if(level>1){
             level--;
             res->push_back(vConstruct(arr[i],level));
         }else{
             res->push_back(&arr[i]);
         }
     }
     return &res;
}


ругается не понятно поч.

Это сообщение отредактировал(а) Тигер - 5.4.2010, 14:42
PM MAIL   Вверх
Тигер
Дата 5.4.2010, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



сделал через Ж.
оказалось что void* нельзя разименовывать. капец.
PM MAIL   Вверх
Ozerich
Дата 5.4.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

Репутация: 4
Всего: 5



Цитата(Тигер @ 5.4.2010,  21:26)
сделал через Ж.
оказалось что void* нельзя разименовывать. капец.

Конечно нельзя. А откуда компилятор знает сколько место занимают данные которые там лежат?
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Тигер
Дата 5.4.2010, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



а как уже кроме void* можно получить произвольной вложенности vector<vector>
PM MAIL   Вверх
bsa
Дата 6.4.2010, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Тигер, через одномерный массив. Т.е. ты хранишь два одномерных массива: размерностей и данных. Доступ к каждому элементу через "вектор координат". Каждый элемент которого умножается на сумму размерностей ему предшествующих и суммируется с предыдущим умножением. В результате получаешь индекс в одномерном массиве.
PM   Вверх
Тигер
Дата 6.4.2010, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



алгоритм представил, но реализация видится велосипедной и неудобной. хотелось бы на чистом stl
как быть с общим интерфейсом?

Это сообщение отредактировал(а) Тигер - 6.4.2010, 18:02
PM MAIL   Вверх
bsa
Дата 6.4.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Тигер, не понял, а что в ней велосипедного?
Код
template<class T>
class Array
{
public:
   typedef std::vector<size_t> Vector;
   Array(const Vector &dims);
   T& operator[](const Vector &v);
   const T& operator[](const Vector &v) const;
private:
   const Vector dims_; ///< размерности
   std::vector<T> data_; ///< массив данных
};

PM   Вверх
Тигер
Дата 8.4.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



велосипедная наверное грубо. но это обёртка над stl, которая и так обёртка над стандартными возможностями.
хотя мб в СИ такая избыточность нормальна?

ну и не понятно как будет с остальным интерфейсом вектора. к примеру, надо будет мне это 
Код

double a[4][4][5]={...};
Array<double> ar(a);
a[0].size();

придётся значит переписывать метод size()


Это сообщение отредактировал(а) Тигер - 8.4.2010, 00:20
PM MAIL   Вверх
bsa
Дата 8.4.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Тигер, начнем с того, что это не будет работать с приведенным мной примером, так как у меня оператора [] получающего на входе целое нет - его придется тебе самому писать. Не говоря уже о конструкторе.

Ты пытаешься создать свой собственный контейнер. Ты можешь использовать вектор, а можешь и не использовать. Это твое право. И никакой избыточности тут нет.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.