Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 1
Регистрация: 04.10.2017
Сообщений: 14
1

Шаблон класса вектор

09.10.2017, 11:02. Просмотров 1656. Ответов 2
Метки нет (Все метки)


Реализовать шаблон контейнерного класса vector, который бы характеризовался поведением, эквивалентной стандартном контейнера STL.Не могу понять как реализовать,если у кого есть примеры или литература тогда скиньте пожалуйста ссылку.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2017, 11:02
Ответы с готовыми решениями:

шаблон класса вектор
На экзамене будет задание: создать шаблонный класс вектор с возможностью вывода...

шаблон класса вектор
Программа написана в qt при компиляции выдает ошибки - помогите разобраться. Вроде все написано...

шаблон класса вектор
В общем говоря нужно описать методы вектора и перегрузки операций. Во всех контейнерах для...

Шаблон класса вектор
template <class T> class Vector { public: //? int size; T* data; public: Vector(int);...

2
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,176
09.10.2017, 11:22 2
Лучший ответ Сообщение было отмечено Игорь Князь как решение

Решение

Это из моих старых наработок, может быть вам пригодиться... :
Тут фигни всякой много... Но главный принцип виден.
А именно, нас интересует модель данных:

C++
1
2
3
T* m_data = nullptr;
size_t m_capacity = 0;
size_t m_size = 0;
И метод:
C++
1
unsigned char reserve(size_t sz)
Остальное не сложно додумать.

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
#ifndef GXX_VECTOR_H
#define GXX_VECTOR_H
 
#include <gxx/utility.h>
#include <gxx/algorithm.h>
#include <gxx/allocator.h>
 
#include <gxx/util/setget.h>
 
namespace gxx {
 
    template<typename T, class Allocator = gxx::allocator<T>>
    class vector {
    public:
        using iterator = T*;
        using const_iterator = const T*;
 
    private:
        //resources
        T* m_data = nullptr;
        size_t m_capacity = 0;
        size_t m_size = 0;
    
        //generated
        Allocator m_alloc;
 
    public:
        CONSTREF_GETTER(data, m_data);
        CONSTREF_GETTER(size, m_size);
        CONSTREF_GETTER(capacity, m_capacity);
 
        vector(const Allocator& alloc = Allocator()) : m_alloc(alloc) {}
 
        vector(const vector& other) : m_data(other.m_data), m_capacity(other.m_capacity), m_size(other.m_size) {
            m_data = m_alloc.allocate(m_size);
            //gxx::copy(other.m_data, other.m_data + other.m_size, m_data);
            for (auto ip = other.m_data, op = m_data; ip != other.m_data + other.m_size; ip++, op++) {
                gxx::constructor(op, *ip);
            }
        }
    
        ~vector() {
            gxx::array_destructor(begin(),end());
            if (m_data) m_alloc.deallocate(m_data);
        }
 
        unsigned char reserve(size_t sz) {
            if (sz > m_capacity) return changeBuffer(sz);
            return 1;
        }
 
        iterator begin() { return m_data; }
        iterator end() { return m_data + m_size; }
        iterator rbegin() { return m_data + m_size - 1; }
        iterator rend() { return m_data - 1; }
    
        template <typename ... Args>
        void emplace_back(Args&& ... args) {
            reserve(m_size + 1);
            gxx::constructor(m_data + m_size, std::forward<Args>(args)...);
            m_size++; 
        }
    
        void push_back(const T& ref) {
            reserve(m_size + 1);
            gxx::constructor(m_data + m_size, ref);
            m_size++; 
        }
 
        template<typename ... Args>
        iterator emplace(const_iterator pos, Args&& ... args) {
            //TODO insert optimization 
            size_t _pos = pos - m_data;
 
            reserve(m_size + 1);
            m_size++; 
            
            iterator first = m_data + _pos;
            iterator last = gxx::prev(end());
            gxx::move_backward(first, last, end());
            new (first) T(std::forward<Args>(args) ...);
            
            return first;
        }
 
        iterator insert(const_iterator pos, const T& value) {
            //TODO insert optimization 
            size_t _pos = pos - m_data;
 
            reserve(m_size + 1);
            m_size++; 
            
            iterator first = m_data + _pos;
            iterator last = gxx::prev(end());
            gxx::move_backward(first, last, end());
            *first = value;
            
            return first;
        }
 
        iterator insert(int pos, const T& value) {
            return insert(m_data + pos, value);
        }
 
        iterator insert_sorted(T const& item) {
            return insert(gxx::upper_bound(begin(), end(), item ), item);
        }
    
        T& operator[](size_t num) {
            reserve(num + 1);
            if (num >= m_size) m_size = num + 1;
            return *(m_data + num);
        }
 
        void resize(size_t n) {
            reserve(n);
            m_size = n;
        }
 
        void erase(iterator newend) {
            m_size = newend - m_data;
        }
 
    protected:
        unsigned char changeBuffer (size_t sz) {
            auto newbuf = m_alloc.allocate(sz);
            m_capacity = sz;
            if (m_data == nullptr) {
                m_data = newbuf;
                return 1;
            }
            
            auto ie = end();
            auto oe = newbuf + sz;
 
            for(auto ip = begin(), op = newbuf; op != oe && ip != ie; op++, ip++) {
                gxx::constructor(op, *ip);
            }
 
            gxx::array_destructor(begin(), end());
            auto oldbuf = m_data; 
            m_data = newbuf;
            m_alloc.deallocate(oldbuf);
            return 1;
        }
    };
}
 
#endif
0
281 / 235 / 114
Регистрация: 07.09.2016
Сообщений: 587
09.10.2017, 11:45 3
Большая коллекция решенных задач
вот там есть некий
10. вектор с итератором.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2017, 11:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Шаблон класса вектор с двумя членами-данными
Здравствуйте Уважаемые. Нужна Ваша помощь в реализации программы: Построить шаблон класса Vector....

Шаблон класса вектор с операциями индексации и функциями insert и erase
У меня есть задача. функции erase и insert я реализовала. но чтобы они работали нужно написать...

Шаблон родительского класса и шаблон класса потомка
Запутался, как правильно пронаследоваться от шаблона класса? #include &lt;iostream&gt; #include...

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают)...


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

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

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