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

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

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

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

06.06.2014, 23:38. Просмотров 1720. Ответов 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));
    }
};
Все равно не работает. А можно сделать чтоб и красиво, и работало?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.06.2014, 23:46     Инициализировать вектор unique_ptr #2
чем инициализировать хочешь? nullptr и так по дефолту.
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
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
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
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
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.06.2014, 00:44     Инициализировать вектор unique_ptr #6
Цитата Сообщение от Renji Посмотреть сообщение
некрасиво
вам шашечки или ехать?
Renji
1753 / 1180 / 274
Регистрация: 05.06.2014
Сообщений: 3,398
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++
C++ Инициализировать вектор потоком ввода из консоли
C++ Std::unique_ptr virtual метод
C++ применинь указатель unique_ptr вместо обычного
C++ Как инициализировать вектор в классе?

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

Или воспользуйтесь поиском по форуму:
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
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
Ответ Создать тему
Опции темы

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