std::vector vs. std::auto_ptr
От: fordil  
Дата: 03.11.10 09:27
Оценка:
Добрый день!
Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается).
Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>

Есть функции, в которые нужно собственно передать указатель на BYTE,
для вектора будет вызываться: function(...,&vect[0],...)
для auto_ptr : function(...,ptr.get(),...)

Посоветуйте, какой контейнер подойдет больше, плюсы/минусы обоих подходов?

PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?
Re: std::vector vs. std::auto_ptr
От: llirik  
Дата: 03.11.10 09:36
Оценка:
Здравствуйте, fordil, Вы писали:

F>Добрый день!

F>Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается).
F>Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>

F>Есть функции, в которые нужно собственно передать указатель на BYTE,

F>для вектора будет вызываться: function(...,&vect[0],...)
F>для auto_ptr : function(...,ptr.get(),...)

F>Посоветуйте, какой контейнер подойдет больше, плюсы/минусы обоих подходов?


F>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?


auto_ptr это не контейнер, а умный указатель, который при присваивании одного auto_ptr другому (например, при передачи в параметры функции)
отнимет указатель на ваш BYTE у первого.

вы рассматриваете возможность хранить в векторе 1 BYTE ???
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Re: std::vector vs. std::auto_ptr
От: abrec Россия  
Дата: 03.11.10 09:42
Оценка:
Здравствуйте, fordil, Вы писали:

F>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?


Класть std::auto_ptr в контейнеры — это неправильно.
Re: std::vector vs. std::auto_ptr
От: _Dreamer Россия  
Дата: 03.11.10 09:42
Оценка:
Здравствуйте, fordil, Вы писали:

F>Добрый день!

F>Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается).
F>Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>

дело в том, что std::vector<BYTE> — это аналог массива, тоесть аналог 'new BYTE[size]' / 'delete []'
тогда как std::auto_ptr<BYTE> это умный указатель(а не контейнер), аналог 'new BYTE' / 'delete'

F>Посоветуйте, какой контейнер подойдет больше, плюсы/минусы обоих подходов?


так что если нужно хранение именно массива, то std::vector<BYTE>

F>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?


нет, хранить std::auto_ptr<> в контейнерах нельзя.
Re: std::vector vs. std::auto_ptr
От: Bell Россия  
Дата: 03.11.10 09:43
Оценка: 1 (1) +1
Здравствуйте, fordil, Вы писали:

F>Добрый день!

F>Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается).
F>Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>

F>Есть функции, в которые нужно собственно передать указатель на BYTE,

F>для вектора будет вызываться: function(...,&vect[0],...)
F>для auto_ptr : function(...,ptr.get(),...)

F>Посоветуйте, какой контейнер подойдет больше, плюсы/минусы обоих подходов?

Если речь идет о единичном элементе типа BYTE, то гораздо естественнее использовать std::auto_ptr. У вектора банально больше накладные расходы, да и использование вектора сразу наводит на мысль о массиве.
Если мы говорим о массивах, то однозначно std::vector. std::auto_ptr просто не предназначен для хранения массивов — хотя бы из-за delete без скобочек в деструкторе, что есть UB.

F>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?

Нет. std::auto_ptr не удовлетворяет требованиям, предъявляемым к элементам стандартных контейнеров из-за своей семантики копирования и присваивания (элементы стандартных контейнеров должны быть copy-constructible и assignable)
Любите книгу — источник знаний (с) М.Горький
Re[2]: std::vector vs. std::auto_ptr
От: fordil  
Дата: 03.11.10 09:46
Оценка:
>вы рассматриваете возможность хранить в векторе 1 BYTE ???

Нет) У меня есть последовательность символов, для хранения одного символа используется апишный тип BYTE.
Re[3]: std::vector vs. std::auto_ptr
От: llirik  
Дата: 03.11.10 10:01
Оценка:
Здравствуйте, fordil, Вы писали:

>>вы рассматриваете возможность хранить в векторе 1 BYTE ???


F>Нет) У меня есть последовательность символов, для хранения одного символа используется апишный тип BYTE.


тогда есс-но std::vector<BYTE>, только он в хипе память выделит
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Re[3]: std::vector vs. std::auto_ptr
От: igna Россия  
Дата: 03.11.10 10:05
Оценка:
Здравствуйте, fordil, Вы писали:

F>Нет) У меня есть последовательность символов, для хранения одного символа используется апишный тип BYTE.


auto_ptr нельзя использовать для хранения указателя полученного вызовом new для массивов.
Re[4]: std::vector vs. std::auto_ptr
От: fordil  
Дата: 03.11.10 10:30
Оценка:
I>auto_ptr нельзя использовать для хранения указателя полученного вызовом new для массивов.

Объясните, пожалуйста, почему нельзя. Ну или где об этом можно прочитать?
Re[5]: std::vector vs. std::auto_ptr
От: llirik  
Дата: 03.11.10 10:37
Оценка: :)
Здравствуйте, fordil, Вы писали:

I>>auto_ptr нельзя использовать для хранения указателя полученного вызовом new для массивов.


F>Объясните, пожалуйста, почему нельзя. Ну или где об этом можно прочитать?


для массивов нужно new[] и delete[]
auto_ptr же вызывает просто delete
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Re[5]: std::vector vs. std::auto_ptr
От: Слава Израиль  
Дата: 03.11.10 23:39
Оценка:
Здравствуйте, fordil, Вы писали:

I>>auto_ptr нельзя использовать для хранения указателя полученного вызовом new для массивов.


F>.... Ну или где об этом можно прочитать?


Вот
Автор(ы): Скотт Мейерс
В этой книге известный автор Скотт Мейерс
раскрывает секреты настоящих мастеров, позволяющие добиться максимальной
эффективности при работе с библиотекой STL. Во многих книгах описываются
возможности STL, но только в этой рассказано о том, как работать с этой
библиотекой. Каждый из 50 советов книги подкреплен анализом и убедительными
примерами, поэтому читатель не только узнает, как решать ту или иную задачу, но
и когда следует выбирать то или иное решение — и почему именно такое.
Спасибо за внимание
Re: std::vector vs. std::auto_ptr
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.11.10 04:02
Оценка:
Здравствуйте, fordil, Вы писали:

F>Есть необходимость обернуть указатель на BYTE в STL контейнер (именно STL, boost не рассматривается).

F>Как я понял, подходят два варианта std::vector<BYTE> и std::auto_ptr<BYTE>

F>Есть функции, в которые нужно собственно передать указатель на BYTE,

F>для вектора будет вызываться: function(...,&vect[0],...)
F>для auto_ptr : function(...,ptr.get(),...)

А почему std::string не рассматривается?
На худой конец std::basic_string<BYTE>. Можно как массив BYTE'ов использовать, обращаться по индексу, итерировать, передавать как массив ( .data() ), правда, только как in параметр, как out data() нельзя использовать.
Маньяк Робокряк колесит по городу
Re[2]: std::vector vs. std::auto_ptr
От: Анатолий Широков СССР  
Дата: 06.11.10 09:03
Оценка:
Здравствуйте, abrec, Вы писали:

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


F>>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?


A>Класть std::auto_ptr в контейнеры — это неправильно.


Это запрещено стандартом.
Re[3]: std::vector vs. std::auto_ptr
От: Vamp Россия  
Дата: 08.11.10 20:25
Оценка:
АШ>Это запрещено стандартом.
Что не делает ему чести.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: std::vector vs. std::auto_ptr
От: Анатолий Широков СССР  
Дата: 10.11.10 08:27
Оценка:
Здравствуйте, Vamp, Вы писали:

АШ>>Это запрещено стандартом.

V>Что не делает ему чести.
Стандарт не выбирают
Re[3]: std::vector vs. std::auto_ptr
От: Mr.Delphist  
Дата: 10.11.10 08:49
Оценка: -2
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Здравствуйте, abrec, Вы писали:


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


F>>>PS: И еще вопрос, возможно использовать std::vector<std::auto_ptr<BYTE> > ?


A>>Класть std::auto_ptr в контейнеры — это неправильно.


АШ>Это запрещено стандартом.


?!!

Это никто не запрещает. Просто смысла нет, исходя из семантики. В отличие от того же boost::shared_ptr.
Re[4]: std::vector vs. std::auto_ptr
От: uzhas Ниоткуда  
Дата: 10.11.10 08:56
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Это никто не запрещает


Стандарт нарушается (точнее пророчится UB), если класть auto_ptr в стандартные контейнеры, т.к. auto_ptr не CopyConstructable

20 General utilities library
20.4.5 Class template auto_ptr
3 The auto_ptr provides a semantics of strict ownership. An auto_ptr owns the object it holds a
pointer to. Copying an auto_ptr copies the pointer and transfers ownership to the destination. If more
than one auto_ptr owns the same object at the same time the behavior of the program is undefined.
[Note: The uses of auto_ptr include providing temporary exception-safety for dynamically allocated
memory, passing ownership of dynamically allocated memory to a function, and returning dynamically
allocated memory from a function. auto_ptr does not meet the CopyConstructible and
Assignable requirements for Standard Library container elements and thus instantiating a Standard
Library container with an auto_ptr results in undefined behavior.
—end note]

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.