разная длина элементов в векторе
От: Аноним  
Дата: 06.08.07 08:17
Оценка:
Есть некая структура MyStruct1. Экземпляры этой структуры создаются в куче, оператором new. Указатели на эти экземпляры укладываются в вектор std::vector<MyStruct1*> vec1. Данный вектор, в свою очередь, является элементом структуры MyStruct2. Экземпляры структуры MyStruct2 укладываются в вектор vec2 (не указатели, а сами объекты). Код, выполняющий все это, примерно такой:

struct MyStruct1
{
    int parameter1;
    int parameter2;
    int parameter3;
};

struct MyStruct2
{
    char data[16];
    std::vector<MyStruct1*> vec1;
};


typedef std::vector<MyStruct2> Vector2;



void f(void)
{
// ....

   Vector2 vec2;
   MyStruct1* p;
   MyStruct2 str;

   str.vec1.clear();
   p = new MyStruct1;
   str.vec1.push_back(p);
   vec2.push_back(str);

   str.vec1.clear();
   p = new MyStruct1;
   vec1.push_back(p);
   p = new MyStruct1;
   vec1.push_back(p);
   vec2.push_back(str);

   str.vec1.clear();
   p = new MyStruct1;
   vec1.push_back(p);
   p = new MyStruct1;
   vec1.push_back(p);
   p = new MyStruct1;
   vec1.push_back(p);
   vec2.push_back(str);

// ...
   return;
}



Т.о. в векторе vec2 находится 3 элемента структуры MyStruct2. Но, в каждом из этих элементов длина вектора vec1 разная; 1, 2 и 3.
Получается, что длина элементов контейнера vec2 — разная! Правильно ли это? Если нет, то как сделать правильно?
Спасибо за помощь
Re: разная длина элементов в векторе
От: Kubroid  
Дата: 06.08.07 08:25
Оценка:
А>Т.о. в векторе vec2 находится 3 элемента структуры MyStruct2. Но, в каждом из этих элементов длина вектора vec1 разная; 1, 2 и 3.
А>Получается, что длина элементов контейнера vec2 — разная! Правильно ли это? Если нет, то как сделать правильно?
А>Спасибо за помощь

Все нормально. Вектор держит данные не в "себе", а в некоторой памяти, которую сам выделяет. Так что размер инстанса класса vector не зависит от количества элементов в нет.
Re[2]: разная длина элементов в векторе
От: Аноним  
Дата: 06.08.07 08:37
Оценка:
Здравствуйте, Kubroid, Вы писали:

K>Все нормально. Вектор держит данные не в "себе", а в некоторой памяти, которую сам выделяет. Так что размер инстанса класса vector не зависит от количества элементов в нет.


Спасибо
Re: разная длина элементов в векторе
От: _vvs Россия  
Дата: 06.08.07 09:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть некая структура MyStruct1. Экземпляры этой структуры создаются в куче, оператором new. Указатели на эти экземпляры укладываются в вектор std::vector<MyStruct1*> vec1. Данный вектор, в свою очередь, является элементом структуры MyStruct2. Экземпляры структуры MyStruct2 укладываются в вектор vec2 (не указатели, а сами объекты). Код, выполняющий все это, примерно такой:


<skipped>

На ваш вопрос вам ответили
У меня возник небольшой вопрос по вашему коду
А в чем прикол такого кода?


typedef std::vector<MyStruct2> Vector2;


По-моему, эффективнее будет хранить указатели или умные указатели:


typedef std::vector<MyStruct2*> Vector2;


Просто в вашем случае структура будет копироваться, а это дополнительные издержки
Re[2]: разная длина элементов в векторе
От: Аноним  
Дата: 07.08.07 16:57
Оценка:
Здравствуйте, _vvs, Вы писали:

_>По-моему, эффективнее будет хранить указатели или умные указатели:


За указатели в контейнерах надо бить. Спарва по пальцам, если не дойдет — тогда по почкам
Умные указатели либо инстансы класса. Иначе можно долго разгребать спорадические плавающие глюки или решать проблему "почему дебаг работает, а релиз падает".
Re[3]: разная длина элементов в векторе
От: Roman Odaisky Украина  
Дата: 08.08.07 07:30
Оценка: +1
Здравствуйте, Аноним, Вы писали:

_>>По-моему, эффективнее будет хранить указатели или умные указатели:


А>За указатели в контейнерах надо бить. Спарва по пальцам, если не дойдет — тогда по почкам :)

А>Умные указатели либо инстансы класса. Иначе можно долго разгребать спорадические плавающие глюки или решать проблему "почему дебаг работает, а релиз падает".

Пока нет c++09::unique_ptr, иногда контейнер указателей — единственное решение.

Но вообще я согласен, редкая программа не выиграет от перехода на умные указатели. Или еще Boost.ptr_container.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.