Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Renji
1821 / 1239 / 288
Регистрация: 05.06.2014
Сообщений: 3,544
#1

Инициализировать вектор unique_ptr - C++

06.06.2014, 23:38. Просмотров 1842. Ответов 7
Метки нет (Все метки)

Как инициализировать вектор unique_ptr?
C++
1
2
3
4
5
std::unique_ptr<int> a(nullptr);
std::unique_ptr<int> b(nullptr);
std::vector<std::unique_ptr<int>>my_vector;
my_vector.push_back(std::move(a));
my_vector.push_back(std::move(b));
Работает, но некрасиво.

C++
1
std::vector<std::unique_ptr<int>>my_vector{std::unique_ptr<int>(nullptr),std::unique_ptr<int>(nullptr)};
Красиво, но не работает. Ругается что "use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>; std::unique_ptr<_Tp, _Dp> = std::unique_ptr<int>]'".

C++
1
2
3
4
5
6
7
8
struct unique_ptr_vector:std::vector<std::unique_ptr<int>>
{
    unique_ptr_vector(std::initializer_list<std::unique_ptr<int>> arg_list)
    {
        for(auto&element:arg_list)
            push_back(std::move(element));
    }
};
Все равно не работает. А можно сделать чтоб и красиво, и работало?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2014, 23:38     Инициализировать вектор unique_ptr
Посмотрите здесь:

инициализировать вектор значениями массива - C++
Вот все что у меня получилось... В чем ошибка подскажите. vector&lt;int&gt; vec; int arr={1,2,3,4,5,6,7,8,9,10}; ...

Как инициализировать вектор в классе? - C++
#pragma once #include &lt;iostream&gt; using namespace std; #include &lt;string&gt; #include &lt;sstream&gt; #include &lt;stack&gt; #include &lt;vector&gt; ...

Как инициализировать вектор set-ов? - C++
Как инициализировать вектор сетов? vector&lt;set&lt;int&gt; &gt; vec; Количество set-ов узнаётся во время выполнения программы, до инициализации....

Инициализировать вектор итераторами множества - C++
Возможна ли инициализация вектора итераторами? set&lt;int&gt; s={1,2,3,4,5}; set&lt;int&gt;::iterator it=s.begin(),it2=s.end(); ...

Инициализировать вектор потоком ввода из консоли - C++
Как вариант: int n; cin &gt;&gt; n; std::vector&lt;int&gt; a (n); Хочу: // перегрузка оператора std::vector&lt;int&gt; a( _input_ ); //...

Использование std::unique_ptr - C++
Есть в коде подобная конструкция, вылетает исключение на этапе очистки памяти. С чем это может быть связано? template &lt;typename T&gt; class...

Копирование std::unique_ptr в структуре - C++
Есть структуры и vector struct myStruct { int a; int b; void* param; }; struct sSetup { int x; int y;

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.06.2014, 23:46     Инициализировать вектор unique_ptr #2
чем инициализировать хочешь? nullptr и так по дефолту.
Renji
1821 / 1239 / 288
Регистрация: 05.06.2014
Сообщений: 3,544
07.06.2014, 00:03  [ТС]     Инициализировать вектор unique_ptr #3
чем инициализировать хочешь? nullptr и так по дефолту.
Вектор - набором ссылок на полиморфные объекты происходящие от общего предка base_class. Но так как текст один фиг не компилируется, то тестовый пример предельно упрощен до набора нулевых указателей на int.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
07.06.2014, 23:45     Инициализировать вектор unique_ptr #4
Цитата Сообщение от Renji Посмотреть сообщение
Вектор - набором ссылок на полиморфные объекты происходящие от общего предка base_class. Но так как текст один фиг не компилируется, то тестовый пример предельно упрощен до набора нулевых указателей на int.
Не думаю, что это возможно. unique_ptr специально так сделан, чтоб его нельзя было копировать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <memory>
#include <vector>
 
struct A
  {
  int m_data;
  A()
    : m_data(0)
    {
 
    }
 
  A(int i_data)
    : m_data(i_data)
    {
    }
 
  ~A() = default;
  };
 
int main()
  {
  std::vector<std::unique_ptr<A>> vector;
  vector.emplace_back(std::make_unique<A>(5));
  vector.emplace_back(std::make_unique<A>(7));
  vector.emplace_back(std::make_unique<A>(10));
  for (const auto& element : vector)
    std::cout << element->m_data << std::endl;
  std::cin.get();
  return 0;
  }
Renji
1821 / 1239 / 288
Регистрация: 05.06.2014
Сообщений: 3,544
07.06.2014, 23:56  [ТС]     Инициализировать вектор unique_ptr #5
Не думаю, что это возможно. unique_ptr специально так сделан, чтоб его нельзя было копировать.
В том и дело, что возможно. Но придется делать костыль заточенный именно под список инициализации из двух элементов.
C++
1
2
3
4
5
6
7
8
struct unique_ptr_vector:std::vector<std::unique_ptr<int>>
{
    unique_ptr_vector(std::unique_ptr<int>&&arg1,std::unique_ptr<int>&&arg2)
    {
        push_back(std::move(arg1));
        push_back(std::move(arg2));
    }
};
А вот чтоб универсально (список инициализации любого размера) и без костыля - чего-то не выходит.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.06.2014, 00:44     Инициализировать вектор unique_ptr #6
Цитата Сообщение от Renji Посмотреть сообщение
некрасиво
вам шашечки или ехать?
Renji
1821 / 1239 / 288
Регистрация: 05.06.2014
Сообщений: 3,544
08.06.2014, 01:15  [ТС]     Инициализировать вектор unique_ptr #7
вам шашечки или ехать?
Ехать и с голыми указателями можно, в ручную управляя освобождением памяти. Если в язык ввели удобные списки инициализации, вполне логично пытаться сделать наполнение вектора через них.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 02:51     Инициализировать вектор unique_ptr
Еще ссылки по теме:

Компилятор не видит std::unique_ptr - C++
Не создается unique_ptr int main(int argc, char *argv) { QCoreApplication a(argc, argv); std::unique_ptr&lt;int&gt; p; ...

Std::unique_ptr virtual метод - C++
#include &lt;iostream&gt; #include &lt;memory&gt; class Base { public: virtual void f1(); // Virtual function. }; class Derived...

Отсутствует std::unique_ptr gcc 4.8.1 - C++
всем привет , я в С++ начинающий и возникла проблема не работает std::unique_ptr версия компилятора gcc 4.8.1(tdm 2) флаг...

Шаблонные аргументы конструктора std::unique_ptr - C++
Если я пишу код std::unique_ptr&lt;int, void(*)(int*)&gt; myPtr_5(new int, (int* p) {delete p; }); то все приятно, и компилируется без...

применинь указатель unique_ptr вместо обычного - C++
добрый день. Подскажите пожалуйста,как мне данный код заменить на конструкцию с применением умного указателя? using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
08.06.2014, 02:51     Инициализировать вектор unique_ptr #8
Как обходной вариант, более-менее сносный на вид, могу предложить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <memory>
#include <vector>
 
int main() {
    std::unique_ptr<int> items[] = {
        std::unique_ptr<int>{new int{1}},
        std::unique_ptr<int>{new int{3}},
        std::unique_ptr<int>{new int{5}},
    };
    
    std::vector<std::unique_ptr<int>> v {
        std::make_move_iterator(std::begin(items)),
        std::make_move_iterator(std::end(items))
    };
    
    for (const auto& item : v) {
        std::cout << *item << std::endl;
    }
 
    return 0;
}
Yandex
Объявления
08.06.2014, 02:51     Инициализировать вектор unique_ptr
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru