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

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

Войти
Регистрация
Восстановить пароль
 
Goldutop
10 / 10 / 7
Регистрация: 04.09.2014
Сообщений: 62
Завершенные тесты: 1
#1

Initializer_list constructor - C++

04.01.2016, 17:58. Просмотров 402. Ответов 7
Метки нет (Все метки)

Всем привет!

У меня имеется некое упрощенное подобие std::vector:

Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#ifndef VECTOR_H
#define VECTOR_H
 
#include <cstddef>
#include <allocators>
#include <algorithm>
#include <initializer_list>
 
namespace mycontainers
{
    template <typename T>
    class Vector
    {
    public:
        typedef T* iterator;
        typedef const T* const_iterator;
        typedef size_t size_type;
        typedef T value_type;
        typedef T& reference;
        typedef const T& const_reference;
 
        //Constructors
        Vector() { create(); }
        explicit Vector(size_type n, const T &t = T()) { create(n, t);  }
        Vector(const Vector &v) { create(v.begin(), v.end()); }
        Vector(const std::initializer_list<T> &ini) { create(ini.begin(), ini.end()); }
 
        //Assignment
        Vector &operator=(const Vector &);
 
        //Destructor
        ~Vector() { uncreate(); }
 
        //Index access
        T &operator[](size_type i) { return data[i]; }
        const T &operator[](size_type i) const { return data[i]; }
 
        //Push...and *Pop*
        void push_back(const T &t)
        {
            if (avail == limit)
                grow();
            uncheckedAppend(t);
        }
 
        void pop_back()
        {
            if (!empty())
            {
                uncheckedPop();
            }
        }
 
        //Clear
        void clear() { uncreate(); }
 
        //Empty
        bool empty() { return avail - data == 0; }
 
        //size
        size_type size() const { return avail - data; }
        
        //begin and eng
        iterator begin() { return data; }
        const_iterator begin() const { return data; }
 
        iterator end() { return avail; }
        const_iterator end() const { return avail; }
 
    private:
        iterator data;
        iterator avail;
        iterator limit;
 
        std::allocator<T> alloc;
 
        //Allocator functions
        void create();
        void create(size_type, const T &);
        void create(const_iterator, const_iterator);
 
        //Dealloc
        void uncreate();
 
        //Push_back support
        void grow();
        void uncheckedAppend(const T &);
 
        //Pop_back support
        void uncheckedPop();
    };
}
 
#endif // VECTOR_H
 
//Assignment
template <typename T>
mycontainers::Vector<T> &mycontainers::Vector<T>::operator=(const Vector &obj)
{
    if (this == obj)
        return *this;
 
    uncreate();
 
    create(obj.begin(), obj.end());
 
    return *this;
}
 
//Allocs
template <typename T>
void mycontainers::Vector<T>::create()
{
    data = avail = limit = nullptr;
}
 
template <typename T>
void mycontainers::Vector<T>::create(size_type n, const T &t)
{
    data = alloc.allocate(n);
    limit = avail = data + n;
    unitialized_fill(data, limit, val);
}
 
template <typename T>
void mycontainers::Vector<T>::create(const_iterator i, const_iterator j)
{
    data = alloc.allocate(i - j);
 
    limit = avail = uninitialized_copy(i, j, data);
}
 
//Dealloc
template <typename T>
void mycontainers::Vector<T>::uncreate()
{
    if (data)
    {
        iterator it = avail;
 
        while (it != data)
            alloc.destroy(--it);
 
        alloc.deallocate(data, limit - data);
    }
 
    data = avail = limit = nullptr;
}
 
//Push_back support
template <typename T>
void mycontainers::Vector<T>::grow()
{
    size_type newSize = std::max(2 * (limit - data), static_cast<ptrdiff_t>(1));
 
    iterator newData =  alloc.allocate(newSize);
    iterator newAvail = uninitialized_copy(data, avail, newData);
 
    uncreate();
 
    data = newData;
    avail = newAvail;
    limit = newData + newSize;
}
 
template <typename T>
void mycontainers::Vector<T>::uncheckedAppend(const T &t)
{
    alloc.construct(avail++, t);
}
 
//Pop_back support
template <typename T>
void mycontainers::Vector<T>::uncheckedPop()
{
    alloc.destroy(--avail);
}


Я попытался реализовать конструктор с std::initializer_list, но у меня вылетает исключение (abort() has been called).
Пожалуйста, помогите разобраться в чем проблема, заранее спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2016, 17:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Initializer_list constructor (C++):

Итератор (initializer_list) - C++
template &lt;typename T&gt; MyStack&lt;T&gt;::MyStack (initializer_list&lt;T&gt; l) { first=NULL; initializer_list&lt;T&gt;::iterator it; for...

Std::initializer_list wchar_t - C++
Подскажите, не удаётся сделать функцию добавления в массив wchar_t template&lt;class T0, class T1&gt; void add_to_array(T0* arr,...

vector::assign и initializer_list - C++
хочу разобраться как работает vector::assign, на сайте http://www.cplusplus.com/reference/vector/vector/assign/ приводятся три варианта, ...

Вывод типа для initializer_list - C++
Объясните мне почему здесь ошибка компиляции.#include &lt;iostream&gt; #include &lt;set&gt; #include &lt;initializer_list&gt; template &lt;typename...

Затираются значения при возврате из функции initializer_list - C++
Дарова. Объясните, почему при возврате объекта инитиализер_лист из функции значения этого листа трутся #include &lt;iostream&gt; using...

constructor - C++
вы не можете объяснит Это - &gt;&gt; &quot; Counter() : count(0) &quot; // counter.cpp // object represents a counter variable #include...

7
Croessmah
Ушел
13777 / 8027 / 926
Регистрация: 27.09.2012
Сообщений: 19,778
Записей в блоге: 3
Завершенные тесты: 1
04.01.2016, 18:15 #2
Хоть посмотрите где оно в abort валится
0
Somebody
2799 / 1610 / 150
Регистрация: 03.12.2007
Сообщений: 4,210
Завершенные тесты: 3
04.01.2016, 18:20 #3
C++
154
size_type newSize = std::max(2 * (limit - data), static_cast<ptrdiff_t>(1));
?!
0
Goldutop
10 / 10 / 7
Регистрация: 04.09.2014
Сообщений: 62
Завершенные тесты: 1
04.01.2016, 18:22  [ТС] #4
Croessmah, в allocate
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        // TEMPLATE FUNCTION _Allocate
template<class _Ty> inline
    _Ty *_Allocate(size_t _Count, _Ty *)
    {   // allocate storage for _Count elements of type _Ty
    void *_Ptr = 0;
 
    if (_Count == 0)
        ;
    else if (((size_t)(-1) / sizeof (_Ty) < _Count)
        || (_Ptr = ::operator new(_Count * sizeof (_Ty))) == 0)
        _Xbad_alloc();  // report no memory
 
    return ((_Ty *)_Ptr);
    }
0
Kastaneda
Jesus loves me
Эксперт С++
4756 / 2960 / 243
Регистрация: 12.12.2009
Сообщений: 7,516
Записей в блоге: 2
Завершенные тесты: 1
04.01.2016, 18:25 #5
Цитата Сообщение от Goldutop Посмотреть сообщение
Croessmah, в allocate
Значит проблема в коде разработчиков компилятора? Думаю вопрос был где у тебя в коде валится.
1
Goldutop
10 / 10 / 7
Регистрация: 04.09.2014
Сообщений: 62
Завершенные тесты: 1
04.01.2016, 18:28  [ТС] #6
Somebody, а что с этим не так? push_back() работает нормально, вроде.

Добавлено через 2 минуты
Kastaneda, получается, что здесь?

C++
1
2
3
4
5
6
7
template <typename T>
void mycontainers::Vector<T>::create(const_iterator i, const_iterator j)
{
    data = alloc.allocate(i - j);  //here
 
    limit = avail = uninitialized_copy(i, j, data);
}
0
Croessmah
Ушел
13777 / 8027 / 926
Регистрация: 27.09.2012
Сообщений: 19,778
Записей в блоге: 3
Завершенные тесты: 1
04.01.2016, 18:32 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Goldutop, почему i-j? Получается begin-end?
1
Goldutop
10 / 10 / 7
Регистрация: 04.09.2014
Сообщений: 62
Завершенные тесты: 1
04.01.2016, 18:35  [ТС] #8
Croessmah, упсс, глупо получилось, спасибо.
0
04.01.2016, 18:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2016, 18:35
Привет! Вот еще темы с ответами:

this и Copy-Constructor - C++
Скажите пожалуйста почему даный еод вызывает RTE(Run Time Error) Добавлено через 1 минуту Engine engg(*this); Где this...

Copy constructor - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace::std; class alpha{ int data; public: alpha() {} alpha(int d) :...

[C++11] regex constructor исключение - C++
Конструктор регекса выдает какое-то исключение(перехватываю catch(...)), где можно почитать какие они вообще бывают и из-за чего? Заранее...

copy constructor operator= - C++
сижу я значит почитываю черновик будущего стандарта и вижу const C&amp; C::operator=( const C&amp; other) { if ( this != &amp;other ) { ...


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

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

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