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

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

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

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

06.06.2014, 23:38. Просмотров 2092. Ответов 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));
    }
};
Все равно не работает. А можно сделать чтоб и красиво, и работало?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2014, 23:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инициализировать вектор unique_ptr (C++):

Как инициализировать вектор в классе? - 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; ...

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

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

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

Инициализировать вектор потоком ввода из консоли - 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...

7
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.06.2014, 23:46 #2
чем инициализировать хочешь? nullptr и так по дефолту.
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,822
07.06.2014, 00:03  [ТС] #3
чем инициализировать хочешь? nullptr и так по дефолту.
Вектор - набором ссылок на полиморфные объекты происходящие от общего предка base_class. Но так как текст один фиг не компилируется, то тестовый пример предельно упрощен до набора нулевых указателей на int.
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
07.06.2014, 23:45 #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;
  }
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,822
07.06.2014, 23:56  [ТС] #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));
    }
};
А вот чтоб универсально (список инициализации любого размера) и без костыля - чего-то не выходит.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.06.2014, 00:44 #6
Цитата Сообщение от Renji Посмотреть сообщение
некрасиво
вам шашечки или ехать?
0
Renji
1927 / 1325 / 299
Регистрация: 05.06.2014
Сообщений: 3,822
08.06.2014, 01:15  [ТС] #7
вам шашечки или ехать?
Ехать и с голыми указателями можно, в ручную управляя освобождением памяти. Если в язык ввели удобные списки инициализации, вполне логично пытаться сделать наполнение вектора через них.
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
08.06.2014, 02:51 #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;
}
0
08.06.2014, 02:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 02:51
Привет! Вот еще темы с ответами:

Компилятор не видит 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 - C++
привет, столкнулся с такой ситуацией, что вроде как копировать объекты std::unique_ptr запрещено, но тем не менее такой код...

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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