Динамически добавить элемент объекта в std::vector
От: emergen  
Дата: 03.03.15 09:45
Оценка: -2 :)
Подскажите, пожалуйста, как наиболее просто, добавить указатель на созданный динамически объект в контейнер std::vector?
std::vector< MyObject*> vec;

for(i=0; i<DINAMIC_N; i++)
{
  - создаем динамически объект MyObject
  - помещаем указатель в контейнер vec
}


Каким механизмом это делается в С++ — STL?
Re: Динамически добавить элемент объекта в std::vector
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.03.15 09:48
Оценка:
push_back() ?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Динамически добавить элемент объекта в std::vector
От: Igore Россия  
Дата: 03.03.15 09:50
Оценка: +5
Здравствуйте, emergen, Вы писали:

E>Каким механизмом это делается в С++ — STL?

Имей совесть, открываешь документацию vector читаешь какие методы, находишь, да даже intellisenc-a должно было хватить чтобы понять какой метод вызвать.
Re[2]: Динамически добавить элемент объекта в std::vector
От: emergen  
Дата: 03.03.15 10:12
Оценка: -4
Здравствуйте, niXman, Вы писали:

X>push_back() ?



std::vector< MyObject*> vec
MyObject *ptr;

for(i=0; i<DINAMIC_N; i++)
{
ptr = new MyObject();
vec.push_back(ptr);
}


Так получается? Такое будет корректно работать?
Re[3]: Динамически добавить элемент объекта в std::vector
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.03.15 10:13
Оценка: 3 (1)
Здравствуйте, emergen, Вы писали:

E>Так получается? Такое будет корректно работать?

да.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Динамически добавить элемент объекта в std::vector
От: Кодт Россия  
Дата: 03.03.15 10:22
Оценка: 5 (2) +1
Здравствуйте, emergen, Вы писали:

E>Подскажите, пожалуйста, как наиболее просто, добавить указатель на созданный динамически объект в контейнер std::vector?


Книга — лучший подарок.

Хотя, возможно, — в отдалённой перспективе, разумеется, строго после книги, — здесь пригодился бы boost::ptr_vector.
Потому что ведь встанут вопросы: а какое время жизни у объектов, добавленных по указателю. А как их гарантированно поубивать. А как оперировать значениями, а не указателями (например, при сортировке или в циклах). И т.п.

{
  std::vector<Obj*> v;
  v.push_back(new Obj(0));
  v.push_back(new Obj(1));
  v.push_back(new Obj(2));
  std::copy(v.begin(), v.end(), std::ostream_iterator<Obj*>(std::cout, " ")); // выведет кучу адресов
} // убъёт вектор, оставит объекты висеть в памяти

{
  boost::ptr_vector<Obj> v; // поправка. в параметре шаблона указатель не нужен.
  v.push_back(new Obj(0));
  v.push_back(new Obj(1));
  v.push_back(new Obj(2));
  std::copy(v.begin(), v.end(), std::ostream_iterator<Obj&>(std::cout, " ")); // выведет содержимое объектов (если есть оператор ostream<<Obj)
} // убъёт вектор и объекты
Перекуём баги на фичи!
Отредактировано 03.03.2015 10:34 Кодт . Предыдущая версия .
Re[2]: Динамически добавить элемент объекта в std::vector
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 03.03.15 10:25
Оценка: 6 (1) +2
Здравствуйте, Кодт, Вы писали:

К>Книга — лучший подарок.

А бан лучший мотиватор её прочитать.
Sic luceat lux!
Re[3]: Динамически добавить элемент объекта в std::vector
От: jazzer Россия Skype: enerjazzer
Дата: 03.03.15 10:30
Оценка: 3 (1) +1
Здравствуйте, emergen, Вы писали:

E>Здравствуйте, niXman, Вы писали:


X>>push_back() ?


E>std::vector< MyObject*> vec
E>MyObject *ptr;

E>for(i=0; i<DINAMIC_N; i++) 
E>{ 
E>    ptr = new MyObject();
E>    vec.push_back(ptr);
E>}


E>Так получается? Такое будет корректно работать?


Да, но ptr не нужен (если он используется только здесь):
std::vector< MyObject*> vec;
for(i=0; i<DINAMIC_N; i++) 
{ 
    vec.push_back(new MyObject());
}

Но ты должен понимать, что в векторе лежат указатели, а не сами объекты, и убивать ты их должен будешь сам.
Если ты хочешь, чтобы вектор их убил автоматически, когда сам будет умирать — используй не голый указатель, а unique_ptr или smart_ptr:
std::vector< std::unique_ptr<MyObject> > vec;
for(i=0; i<DINAMIC_N; i++) 
{ 
    vec.push_back(std::make_unique<MyObject>());
}


А еще лучше не рисовать рукопашные циклы, использовать алгоритмы непосредственно:
std::generate_n( std::back_inserter(vec), DINAMIC_N, std::make_unique<MyObject> );


ЗЫ Пользуйся разметкой, а то забанят.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Отредактировано 03.03.2015 10:34 jazzer . Предыдущая версия .
Re[4]: Динамически добавить элемент объекта в std::vector
От: emergen  
Дата: 03.03.15 10:31
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, emergen, Вы писали:


E>>Так получается? Такое будет корректно работать?

X>да.

А если вот так?
std::vector< MyObject > vec

vec.resize( DINAMIC_N );


for(i=0; i<DINAMIC_N; i++)
{
    vec[i]....
}
Re[2]: Динамически добавить элемент объекта в std::vector
От: jazzer Россия Skype: enerjazzer
Дата: 03.03.15 10:33
Оценка:
Здравствуйте, Кодт, Вы писали:

К>
К>  boost::ptr_vector<Obj*> v;
К>

звездочка не нужна, просто boost::ptr_vector<Obj>
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Динамически добавить элемент объекта в std::vector
От: jazzer Россия Skype: enerjazzer
Дата: 03.03.15 10:38
Оценка: 2 (1)
Здравствуйте, emergen, Вы писали:

E>А если вот так?

E>
E>std::vector< MyObject > vec

Теперь у тебя в векторе лежат сами объекты, а не указатели на них — это гораздо лучше.

E>vec.resize( DINAMIC_N );
E>

И после этой строчки они все уже будут сконструированы конструктором по умолчанию.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Динамически добавить элемент объекта в std::vector
От: Кодт Россия  
Дата: 03.03.15 10:40
Оценка:
Здравствуйте, jazzer, Вы писали:

J>звездочка не нужна, просто boost::ptr_vector<Obj>

КонтролВэ меня подвело
Перекуём баги на фичи!
Re[4]: Динамически добавить элемент объекта в std::vector
От: Кодт Россия  
Дата: 03.03.15 10:45
Оценка:
Здравствуйте, jazzer, Вы писали:

J>А еще лучше не рисовать рукопашные циклы, использовать алгоритмы непосредственно:

J>
J>std::generate_n( std::back_inserter(vec), DINAMIC_N, std::make_unique<MyObject> );
J>


Задумался о красивом синтаксисе подобных конструкций. Как range-based for... В общем-то, оно и получится, обычный for.

Кстати, на заметку. Неплохо бы рядом сделать vec.reserve(DYNAMIC_N).
Перекуём баги на фичи!
Re[5]: Динамически добавить элемент объекта в std::vector
От: jyuyjiyuijyu  
Дата: 03.03.15 11:39
Оценка: :)
как в этом смысле прекрасен C++/CLI ничего явно освобождать не надо (конечно если это не файлы например или интернет соединения)
Re[5]: Динамически добавить элемент объекта в std::vector
От: jazzer Россия Skype: enerjazzer
Дата: 03.03.15 12:25
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Кстати, на заметку. Неплохо бы рядом сделать vec.reserve(DYNAMIC_N).


Я не рискнул в твоем присутствии придираться к орфографии
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Динамически добавить элемент объекта в std::vector
От: Кодт Россия  
Дата: 03.03.15 12:30
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Я не рискнул в твоем присутствии придираться к орфографии


А я не придирался, а намекнул
Перекуём баги на фичи!
Re: Динамически добавить элемент объекта в std::vector
От: ArtDenis Россия  
Дата: 03.03.15 12:48
Оценка: :)
Здравствуйте, emergen, Вы писали:

E>Каким механизмом это делается в С++ — STL?


Хотя Кодт и написал про книжку, а к тому же ещё это запрещено правилами, но я всё-таки скажу

НУ ПОЧИТАЙ КНИЖКУ ПО С++ НАКОНЕЦ-ТО!!!

РАДИ БОГА, В КРАЙНЕМ СЛУЧАЕ ПРОСТО ПОЛИСТАЙ И ПОСМОТРИ ПРИМЕРЫ!!!

[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Динамически добавить элемент объекта в std::vector
От: Muxa  
Дата: 03.03.15 17:42
Оценка: +2 :)
AD>

НУ ПОЧИТАЙ КНИЖКУ ПО С++ НАКОНЕЦ-ТО!!!

AD>

РАДИ БОГА, В КРАЙНЕМ СЛУЧАЕ ПРОСТО ПОЛИСТАЙ И ПОСМОТРИ ПРИМЕРЫ!!!


Зачем?
Ведь он же код писать начнет.
Re[2]: Динамически добавить элемент объекта в std::vector
От: Carc Россия http://www.amlpages.com/home.php
Дата: 03.03.15 17:55
Оценка: +1 :))) :))) :))
AD>

НУ ПОЧИТАЙ КНИЖКУ ПО С++ НАКОНЕЦ-ТО!!!

AD>

РАДИ БОГА, В КРАЙНЕМ СЛУЧАЕ ПРОСТО ПОЛИСТАЙ И ПОСМОТРИ ПРИМЕРЫ!!!


Да чего вы к парню то пристали... Он же просто читать не умеет. А так ответ пришел, выделили, копи-пастим это дело в какой-нить гугле-траснсляторо и тама щелкаем кнопачку "Воспроизвести". И все чики-поки... А вы тут академики, начали, блин, "почитай, полистай"... "Книжки" еще какие-то придумали. Динозавры одно слово.

Cовет топик-стартеру. Так вопросы не пишут. Тут на КЫВТ есть мануал как задавать вопросы. Но есть одно потаённое правило, которое там не описано (еще б! Серебренная ж пуля — зато как стреляет ).

Напишите примерно так
"Я студенткА, не смогла разобраться, помогите, а то я совсем запуталась". И побольше прошедшего времени, там обязательно разнятся окончания глаголов для подлежащего мужского и женского рода. Казалось, бы сплошное равноправие тире эмансипация. Ан фиг! Попробуйте и увидите результат.

PS: товарищи админы не баньте меня пожалуйста, но к вечеру истерика от наблюдения дискуссии по поводу дважды два потребовала выхода. Я правда больше не буду. Долго не буду.
Aml Pages Home
Re[7]: Динамически добавить элемент объекта в std::vector
От: c-smile Канада http://terrainformatica.com
Дата: 05.03.15 21:17
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, jazzer, Вы писали:


J>>Я не рискнул в твоем присутствии придираться к орфографии


К>А я не придирался, а намекнул


Ну не все модераторы так толерантны , я за такой же намёк заработал



первый раз за 13 лет на RSDN сподобился вот ... градус растёт
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.