1 / 1 / 0
Регистрация: 29.08.2014
Сообщений: 18
1

Необходимо реализовать шаблонный класс Array, и грамотно реализовать push_back

03.10.2014, 00:06. Показов 7524. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо реализовать шаблонный класс Array, параметризируемый типом хранимых

элементов.

Класс Array представляет собой контейнер элементов типа T, реализованный на основе

динамического массива. Необходимо реализовать следующие методы:

1. Конструктор, получающий максимальное количество хранимых элементов в массиве.

Считается, что после конструирования в массиве не содержится ни один элемент.

2. Деструктор, освобождающий используемую динамическую память.

3. Оператор присваивания.

4. Конструктор копирования.

5. Метод push_back, добавляющий элемент в конец массива.

6. Метод получения и задания элемента массива с заданным индексом через оператор

индексирования. Если индекс выходит за логические границы массива, то должно быть

выброшено исключение.

7. Метод capacity() const, возвращающий общую ёмкость динамического массива.

8. Метод size() const, возвращающий количество заполненных элементов динамического

массива.

9. Метод begin() const, возвращающий начало внутреннего динамического массива.

10.Метод end() const, возвращающий элемент, следующий за последним логическим

элементом массива.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2014, 00:06
Ответы с готовыми решениями:

Реализовать шаблонный класс
В общем требуется реализовать шаблонный класс FixedArray<T,N> FixedArray - абстракция вокруг...

Класс Matrix: реализовать шаблонный класс для двумерных массивов
Доброго времени суток. У меня вопрос: я создал класс Array со внутренним динамическим массивом и...

Реализовать шаблонный класс property
Необходимо реализовать шаблонный класс property, реализующийся на С++ станд. средствами ...

Шаблоны. Реализовать шаблонный класс очередь
Реализовать шаблонный класс очередь. Реализовать все основные операции: положить, взять, удалить...

6
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
03.10.2014, 02:20 2
Лучший ответ Сообщение было отмечено ВаняБином как решение

Решение

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
#include <iostream>
#include <exception>
 
template <typename T>
class Array
{
    template <typename U>
    friend void swap(Array<U>&, Array<U>&);
 
public:
    typedef std::size_t     size_type;
    typedef T               value_type;
    typedef value_type&     reference;
    typedef const reference const_reference;
 
    //c-like iterator
    typedef T* iterator;
 
    Array() :
        _data(nullptr),
        _size(0),
        _capacity(0)
    {
    }
 
    Array(const Array& other)
    {
        if (!(_data = (value_type*)malloc(other.capacity() * sizeof(value_type))))
        {
            throw std::bad_alloc();
        }
 
        _size = other.size();
        _capacity = other.capacity();
    }
 
    Array& operator=(Array other)
    {
        other.swap(*this);
        return *this;
    }
 
    ~Array()
    {
        _dealloc();
    }
 
    void swap(Array& other)
    {
        std::swap(_data, other._data);
 
        std::swap(_size, other._size);
        std::swap(_capacity, other._capacity);
    }
    
    size_type size() const
    {
        return _size;
    }
 
    size_type capacity() const
    {
        return _capactity;
    }
 
    void push_back(const value_type& value)
    {
        if (_size == 0)
        {
            _alloc(1);
            _capacity = 1;
        }
        else if (_size == _capacity)
        {
            _alloc(_capacity * 2);
            _capacity *= 2;
        }
 
        _data[_size++] = value;
    }
    
    reference at(size_type i)
    {
        if (i >= _size)
            throw std::out_of_range();
 
        return _data[i];
    }
 
    const_reference at(size_type i) const
    {
        if (i >= _size)
            throw std::out_of_range();
 
        return _data[i];
    }
 
    reference operator[](size_type i)
    {
        return _data[i];
    }
 
    const_reference operator[](size_type i) const
    {
        return _data[i];
    }
 
    iterator begin()
    {
        if (_size == 0)
            return end();
 
        return &_data[0];
    }
 
    iterator end()
    {
        if (_capacity == 0)
            return nullptr;
 
        return &_data[_size];
    }
 
private:
    value_type *_data;
 
    size_type _size;
    size_type _capacity;
 
    void _alloc(size_type count)
    {
        if (!(_data = (value_type*)realloc(_data, count * sizeof(value_type))))
        {
            throw std::bad_alloc();
        }
    }
 
    void _dealloc()
    {
        free(_data);
    }
};
 
int main()
{
    int count = 10;
    Array<int> array;
 
    for (int i = 0; i < count; ++i)
    {
        array.push_back(i);
    }
 
    for (Array<int>::iterator it = array.begin(); it != array.end(); ++it)
    {
        std::cout << *it << std::endl;
    }
 
    std::getchar();
 
    return 0;
}
1
1 / 1 / 0
Регистрация: 29.08.2014
Сообщений: 18
04.10.2014, 23:22  [ТС] 3
stima, Воу!!! Но я бы хотел спросить. А как это все реализвать с помошью new delete ?

delete[] _data; - это понятно !!!

а как реаалок ?
0
5497 / 4892 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2014, 00:37 4
stima, интересный у тебя конструктор копирования... Память выделил и всё?
0
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
05.10.2014, 06:00 5
Цитата Сообщение от stima Посмотреть сообщение
C++
1
2
typedef value_type&  reference;
typedef const reference const_reference;
Так получается что reference и const_reference - это int &, т.к. const во 2-м случае применяется к ссылке, а она и так константна.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
05.10.2014, 14:16 6
Лучший ответ Сообщение было отмечено ВаняБином как решение

Решение

ВаняБином, Через new[] и delete[] можно (1. аллоцируете, 2. копируете, 3. удаляете), но не выгодно, поэтому никто и не использует.

alsav22, gray_fox, 2 часа ночи дали о себе знать.

Подправил:
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
#include <iostream>
#include <exception>
 
template <typename T>
class Array
{
    template <typename U>
    friend void swap(Array<U>&, Array<U>&);
 
public:
    typedef std::size_t         size_type;
    typedef T                   value_type;
    typedef value_type&         reference;
    typedef const value_type&   const_reference;
 
    //c-like iterator
    typedef T* iterator;
 
    Array() :
        _data(nullptr),
        _size(0),
        _capacity(0)
    {
    }
 
    Array(const Array& other)
    {
        _alloc(other.capacity());
 
        std::copy(_data, other._data, other.size());
        std::copy(_size, other.size());
        std::copy(_capacity, other.capacity());
    }
 
    Array& operator=(Array other)
    {
        other.swap(*this);
        return *this;
    }
 
    ~Array()
    {
        _dealloc();
    }
 
    void swap(Array& other)
    {
        std::swap(_data, other._data);
 
        std::swap(_size, other._size);
        std::swap(_capacity, other._capacity);
    }
    
    size_type size() const
    {
        return _size;
    }
 
    size_type capacity() const
    {
        return _capactity;
    }
 
    void push_back(const value_type& value)
    {
        if (_size == 0)
        {
            _alloc(1);
            _capacity = 1;
        }
        else if (_size == _capacity)
        {
            _alloc(_capacity * 2);
            _capacity *= 2;
        }
 
        _data[_size++] = value;
    }
    
    reference at(size_type i)
    {
        if (i >= _size)
            throw std::out_of_range();
 
        return _data[i];
    }
 
    const_reference at(size_type i) const
    {
        if (i >= _size)
            throw std::out_of_range();
 
        return _data[i];
    }
 
    reference operator[](size_type i)
    {
        return _data[i];
    }
 
    const_reference operator[](size_type i) const
    {
        return _data[i];
    }
 
    iterator begin()
    {
        if (_size == 0)
            return end();
 
        return &_data[0];
    }
 
    iterator end()
    {
        if (_capacity == 0)
            return nullptr;
 
        return &_data[_size];
    }
 
private:
    value_type *_data;
 
    size_type _size;
    size_type _capacity;
 
    void _alloc(size_type count)
    {
        if (!(_data = (value_type*)realloc(_data, count * sizeof(value_type))))
        {
            throw std::bad_alloc();
        }
    }
 
    void _dealloc()
    {
        free(_data);
    }
};
 
int main()
{
    int count = 10;
    Array<int> array;
 
    for (int i = 0; i < count; ++i)
    {
        array.push_back(i);
    }
 
    for (Array<int>::iterator it = array.begin(); it != array.end(); ++it)
    {
        std::cout << *it << std::endl;
    }
 
    std::getchar();
 
    return 0;
}
1
1 / 1 / 0
Регистрация: 29.08.2014
Сообщений: 18
15.10.2014, 19:59  [ТС] 7
stima, Спасибо! Но я не совсем знаком с аллоками и реаллоками, ведь можно проще !

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
template<typename T>
class Stack
{
 
public:
 
    Stack(int capacity)
    {
        _capacity = capacity;
        _TopIndex = -1;
        _stack = new T[capacity];
        for(int i = 0; i < _capacity; ++i)
            _stack[i] = T(); 
    }
 
    Stack(const Stack &other)
    {
        _capacity = other._capacity;
        _TopIndex = other._TopIndex;
 
        _stack = new int [_capacity = other._capacity];
 
         for (int i = 0; i < _TopIndex + 1; ++i)
            _stack[i] = other._stack[i];
    }
 
    ~Stack()
    {
        delete [] _stack;
    }
 
    Stack &operator = (const Stack & other)     
    {
        if (this == &other) 
            return *this;
      
         delete [] _stack;
             
         _stack = new int [_capacity = other._capacity];
      _TopIndex = other._TopIndex;
 
         for (int i = 0; i < _TopIndex + 1; ++i)
              _stack[i] = other._stack[i];
   
         return *this;  
    }
 
    bool Empty()
    {
        return _TopIndex == -1;
    }
 
    void push_back(T elem)
    {
        _stack[++_TopIndex] = elem;
    }   
 
    friend std::ostream &operator <<(std::ostream &stream , Stack const &obj)
    {
        stream << "Stack" << ":" << "{";
        for(int i = 0; i < obj._capacity; ++i)
            stream << obj._stack[i] << " ";
        stream << "}";
 
        return stream;
    }
 
    T &Top()
    {
        if(Empty())
            throw std::runtime_error("Without elements");
            
        return _stack[_TopIndex];
    }
 
    void Pop()
    {
        if(Empty())
            throw std::runtime_error("Without elements");
 
        --_TopIndex;
    }
 
    int capacity() const
    {
        return _capacity;
    }
    
    int size() const
    {
        return _TopIndex + 1;
    }
    
    T Get(int pos) const
    {
        return _stack[pos];
    }
 
 
 
private:
    int _TopIndex;
    int _capacity;
    T * _stack;
    
 
};
0
15.10.2014, 19:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2014, 19:59
Помогаю со студенческими работами здесь

Реализовать шаблонный класс или функцию
Опишите параметризованный класс односвязный список элементов (параметр – тип). Помогите с...

Реализовать базовый класс Array
Здравствуйте. Очень нужна ваша помощь с заданием: Создать базовый класс Array с полями: массив...

Подсчет положительных и отрицательных элементов массива. Реализовать через класс Array
using System; namespace ConsoleApplication1 { class Class1 { static void...

Шаблонный класс array (C++ 11)
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #include &lt;array&gt; using namespace...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru