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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трехмерный массив std::vector 
:(
    Опции темы
=Женек=
Дата 27.10.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня трехмерный массив
std::vector<std::vector<std::vector<TShareElement> > > Listing;

То есть обращение к нему будет типа Listing[0][0][0];

Мне надо его заполнить.
Насколько я знаю, массим вектора можно заполнить либо
push_back(TShareElement()) затем listing[0][0][0]=ShareElement;
либо сразу push_back(ShareElement);

А вот как мне поступить в случае с трехмерным массивом?

for (int a=0;a<10;a++)
for (int b=0;b<10;b++)
for (int c=0;c<10;c++)
Listing[a][b][c]=ShareElement;


Но перед этим надо вставлять push_back вначале каждого цикла? а если в цикле
С окажется что добавлять ничего не надо?
Нельзя ли сразу одной командой как-нибудь добалвять елементы в самом внутреннем цикле?

Или же лучше заменить структуру на
typedef std::vector<TShareElement> TSharedFolder;
typedef std::vector<TSharedFolder> TSharesOnServer;
typedef std::vector<TSharesOnServer> TSharesOnNet ;
TSharesOnNet SharesOnNet;

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


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



если размерности известны сразу, можно сразу установить их:
Код

Listing.resize(10);
for(int c=0;c<Listing.size();c++)
{
  Listing[c].resize(10);
  for(int k=0;k<Listing[c].size();k++)
    Listing[c][k].resize(10);
}

да и весь этот неудобный код можно запихнуть в функцию
или вообще трехмерный массив оформить, как класс, чтобы удобно было менять любую размерность + , возможно, еще какие-нибудь функции...


--------------------
qqq
PM WWW   Вверх
Dark Elf
Дата 27.10.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А можно использовать вот его:

http://www.boost.org/libs/multi_array/doc/index.html


--------------------
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
=Женек=
Дата 27.10.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нет, размерность не известна...
Добавлено @ 14:10
ЧТо-то как-то не хочется использовать что-то малоизвестное. Лучше уж вектор.


PM MAIL   Вверх
Dark Elf
Дата 27.10.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
ЧТо-то как-то не хочется использовать что-то малоизвестное.


Те времена когда boost был чем-то малоизвестным давно прошли.
Более того сейчас это де-факто стандарт как и STL (где определён vector).



--------------------
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
=Женек=
Дата 27.10.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тем не менее, я хочу решение описанной проблемы для вектора.
PM MAIL   Вверх
maxim1000
Дата 27.10.2005, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



можно написать функции изменения размерностей:
1-я
Код

Listing.resize(n);

2-я
Код

for(int c=0;c<Listing.size();c++)
  Listing[c].resize(n);

3-я
Код

for(int c=0;c<Listing.size();c++)
  for(int k=0;k<Listing[c].size();c++)
    Listing[c][k].resize(n);

Добавлено @ 14:32
и вызывать их, когда надо изменить размерность...
Добавлено @ 14:34
только еще надо в этих циклах подробнее рассмотреть случай с увеличением размерности:
например, при увеличении второй размерности, в массив будут добавляться одномерные вектора, которым тоже нужно установить размер, как у старых...


--------------------
qqq
PM WWW   Вверх
=Женек=
Дата 27.10.2005, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделал вот так

Объявление переменных:

Код

typedef std::vector<TShareElement> TSharedFolder;
TSharedFolder SharedFolder;
typedef std::vector<TSharedFolder> TSharesOnServer;
TSharesOnServer SharesOnServer;
typedef std::vector<TSharesOnServer> TSharesOnNet;
TSharesOnNet SharesOnNet;



Запись в массив:

Код

for (int i=0;i<3;i++)
 {
   for (int j=0;j<3;j++)
      {
          for (int l=0;l<3;l++)
            {
              ShareElement.Name= IntToStr(i)+IntToStr(j)+IntToStr(l);
              SharedFolder.push_back(ShareElement);
            }
          SharesOnServer.push_back(SharedFolder);
          SharedFolder.clear();
      }
   SharesOnNet.push_back(SharesOnServer);
   SharesOnServer.clear();
 }



Чтение из массива

Код

 for (int i=0;i<3;i++)
 {
   for (int j=0;j<3;j++)
      {
          for (int l=0;l<3;l++)
            {
                        ListOfFiles->Lines->Add(SharesOnNet[i][j][l].Name);
            }
         ListOfFiles->Lines->Add("----------------------------------------------");
      }
 }




ЖДУ КРИТИКИ
Добавлено @ 14:54
Все замечательно работает, и структура получиласль удобочитаемая.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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