Форум программистов, компьютерный форум, киберфорум
Тамика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Легкий вариант реализации класса vector.

Запись от Тамика размещена 20.03.2014 в 12:23
Показов 3552 Комментарии 6
Метки c++

Дело было вечером, делать было нечего. Написала простую реализацию класса vector - свой int_array.
Хедерок.
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
#pragma once
#ifndef _INT_ARRAY_
#define _INT_ARRAY_
 
class int_array
{
    int *mas, size, capacity;
public:
    int_array(): mas(0), size(0), capacity(0){};
 
    ~int_array();
 
    explicit int_array(size_t n);
 
    int_array(const int_array& in);
 
    int getSize() const;
 
    int getCapacity() const;
 
    void resize(size_t n);
 
    void reserve(size_t n);
 
    void push_back(int val);
 
    void pop_back();
 
    int& operator[] (int n);
 
    const int& operator[] (int n) const;
 
    const int operator= (const int_array& in);
 
    void clear();
 
    void erase(size_t index);
 
    bool empty() const;
 
    int front() const;
 
    int back() const;
};
 
#endif
Сам код.
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
#include "int_array.h" 
 
int_array::~int_array()
{
    delete [] mas;
}
 
int_array::int_array(size_t n)
{
    if (n < 0)
        return;
 
    mas = new int[n];
    size = n;
    capacity = n;
}
 
int_array::int_array(const int_array& in)
{
    size = in.size;
    capacity = in.capacity;
    mas = new int[capacity];
    for (int i = 0; i < size; ++i)
        mas[i] = in.mas[i];
}
 
int int_array::getSize() const
{
    return size;
}
 
int int_array::getCapacity() const
{
    return capacity;
}
 
void int_array::reserve(size_t n)
{
    if (n > capacity)
    {
        int *temp = new int[n];
        capacity = n;
        for (int i = 0; i < size; ++i)
            temp[i] = mas[i];
        delete []mas;
        mas = temp;
    }
}
 
void int_array::resize(size_t n)
{
    if (size > n)
    {
        capacity = size;
        size = n;
    }
    if (size < n)
    {
        int *temp = new int[n];
        capacity = n;
        for (int i = 0; i < size; ++i)
            temp[i] = mas[i];
        for (int i = size; i < n; ++i )
            temp[i] = 0;
        size = n;
        delete []mas;
        mas = temp;
    }
}
 
void int_array::push_back(int val)
{
    if (size >= capacity)
    {
        size_t new_size = size + 1;
        reserve(new_size + new_size / 2);
    }
    mas[size++] = val;
}
 
void int_array::pop_back()
{
    if (size >= 1)
    --size;
    else
        std::cout << "Size of massive already null! \n"; 
}
 
int& int_array::operator[] (int n)
{
    if (n < size)
    {
        return mas[n];
    }
    else
        std::cout << "Out of range! \n";
}
 
const int& int_array::operator[] (int n) const
{
    if (n < size)
    {
        return mas[n];
    }
    else
        std::cout << "Out of range! \n";
}
 
const int int_array::operator= (const int_array& in)
{       
    if (&in == this)
        return *this->mas;
    delete [] mas;
    size = in.size;
    capacity = in.capacity;
    mas = new int[capacity];
    for (int i = 0; i < size; ++i)
        mas[i] = in.mas[i];
    return *this->mas;
}
 
void int_array::clear()
{
    size = 0;
    capacity = 1;
}
 
void int_array::erase(size_t index)
{
    int *temp = new int[size-1];
    for (int i = 0; i < index; ++ i)
        temp[i] = mas[i];
    for (int i = index + 1; i < size; ++i)
        temp[i - 1] = mas[i];
    size = size - 1;
    int *t = mas;
    mas = temp;
    delete [] t;
}
 
bool int_array::empty() const
{
    if (size == 0) return true;
    else return false;
}
 
int int_array::front() const
{
    return mas[0];
}
 
int int_array::back() const
{
    return mas[size-1];
}
Вот так вот. Советы и комментарии приветствуются.
Метки c++
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 6
Комментарии
  1. Старый комментарий
    Аватар для ISergey
    C++
    1
    2
    3
    4
    
    int_array::int_array(size_t n)
    {
        if (n < 0)
            return;
    Смысл? size_t не может быть меньше 0..
    C++
    1
    2
    3
    4
    
    const int int_array::operator= (const int_array& in)
    {       
        if (&in == this)
            return *this->mas;
    WTF?
    Запись от ISergey размещена 20.03.2014 в 18:15 ISergey вне форума
  2. Старый комментарий
    Цитата Сообщение от ISergey
    C++
    1
    2
    3
    4
    
    int_array::int_array(size_t n)
    {
        if (n < 0)
            return;
    Смысл? size_t не может быть меньше 0..
    Да, не учла, что при отрицательном значении объект-то создастся... Но ничего не проинициализируется и в size, capacity и указателе на массив будет мусор... Слентяйничала.

    Цитата Сообщение от ISergey
    C++
    1
    2
    3
    4
    
    const int int_array::operator= (const int_array& in)
    {       
        if (&in == this)
            return *this->mas;
    WTF?
    И это поправим.
    Спасибо за комментарий! И правда есть много ошибок. Сегодня же начну править и переделывать код!
    Запись от Тамика размещена 20.03.2014 в 19:27 Тамика вне форума
  3. Старый комментарий
    Смысл? size_t не может быть меньше 0..
    Таки нет. Как раз size_t обеспечит защиту от отрицательных значений.
    Запись от Тамика размещена 21.03.2014 в 15:53 Тамика вне форума
  4. Старый комментарий
    C++
    1
    2
    3
    4
    5
    
    void int_array::resize(size_t n)
    {
        if (size > n)
        {
            capacity = size; // ???
    C++
    1
    2
    3
    4
    5
    6
    
    void int_array::resize(size_t n)
    {
    ...
        if (size < n)
        {
            int *temp = new int[n]; // если n <= capacity :-(
    C++
    1
    2
    3
    4
    
    void int_array::clear()
    {
        size = 0;
        capacity = 1; // ???
    C++
    1
    2
    3
    
    void int_array::erase(size_t index)
    {
        int *temp = new int[size-1]; // зачем? :-(
    Запись от Somebody размещена 21.03.2014 в 16:26 Somebody вне форума
  5. Старый комментарий
    Аватар для SatanaXIII
    Небольшое замечание по оформлению. Интерфейс класса было бы неплохо сгруппировать по какому-либо признаку. Хоть дополнительными отступами выделить, хоть комментариями, но чтобы не нужно было вчитываться в название каждого метода, чтобы найти какой-то конкретный. Конструкторы к конструкторам, геттеры к геттерам, сеттеры к сеттерам. Или как-то парами, если оба работают с одними и теми же данными. Приятнее читать будет.
    Запись от SatanaXIII размещена 21.03.2014 в 20:17 SatanaXIII вне форума
  6. Старый комментарий
    Цитата Сообщение от SatanaXIII
    Небольшое замечание по оформлению. Интерфейс класса было бы неплохо сгруппировать по какому-либо признаку. Хоть дополнительными отступами выделить, хоть комментариями, но чтобы не нужно было вчитываться в название каждого метода, чтобы найти какой-то конкретный. Конструкторы к конструкторам, геттеры к геттерам, сеттеры к сеттерам. Или как-то парами, если оба работают с одними и теми же данными. Приятнее читать будет.
    Да, с этим у меня проблемы... В смысле - постоянно забиваю на это
    Запись от Тамика размещена 22.03.2014 в 10:31 Тамика вне форума
 
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru