Страницы

Поиск по вопросам

суббота, 15 июня 2019 г.

Копирование из shared_ptr в unique_ptr

Добрый вечер. Сразу к теме: есть контейнер map> mymap; (MySet - пользовательский тип). Есть другой контейнер: forward_list> myset; Вопрос: как из forward_list копировать элементы в map (из shared_ptr в unique_ptr)?


Ответ

Как я понимаю, объект класса std::map> должен быть владельцем указателей на объекты MySet, а потому при копировании нужно создавать копии объектов, хранящихся в std::forward_list>
Для этих целей можно использовать либо обычный цикл, либо стандартные алгоритмы, как, например, std::transform
Ниже приведена демонстрационная программа, которая показывает, как можно использовать алгоритм std::transform для копирования элементов из одного контейнера в другой. Для наглядности в вызовы конструкторов и деструкторов класса, используемого в качестве базового элемента, я включил вывод на консоль.
#include #include #include #include #include #include #include
struct A { A() { std::cout << "A::A()" << std::endl; } A( const A & ) { std::cout << "A::A( const A & )" << std::endl; } ~A() { std::cout << "A::~A" << std::endl; } A & operator =( const A & ) { std::cout << "A::operator =( const A & )" << std::endl; return *this; } };
int main() { std::forward_list> lst; lst.push_front( std::shared_ptr( new A ) );
std::map> m;
std::transform( lst.begin(), lst.end(), std::inserter( m, m.end() ), []( auto p ) { return std::make_pair( 1, std::unique_ptr
( new A( *p.get() ) ) ); } );
return 0; }
Вывод на консоль будет:
A::A() A::A( const A & ) A::~A A::~A

Комментариев нет:

Отправить комментарий