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

Усовершенствованный вектор!

Запись от Тамика размещена 21.03.2014 в 18:12
Показов 5282 Комментарии 12
Метки c++

Прислушиваясь к советам форумчан, исправила свой int_array, добавила пару новых функций, пару перегрузов. Оцениваем и комментируем!
Header
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
#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[] (size_t n);
 
    const int& operator[] (size_t n) const;
 
    int& int_array::at(size_t n);
 
    int_array& operator= (const int_array& in);
 
    void clear();
 
    void erase(size_t index);
 
    bool empty() const;
 
    int front() const;
 
    int back() const;
 
    int& int_array::front();
 
    int& int_array::back();
 
    void swap (int_array &in) throw ();
};
 
#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
#include "int_array.h" 
#include <stdexcept>
#include <algorithm> 
 
int_array::~int_array()
{
    delete [] mas;
}
 
int_array::int_array(size_t n)
{
    mas = new int[n];
    for (int i = 0; i < n; ++i)
        mas[i] = 0;
    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)
    {
        size = n;
        return;
    }
    if (size < n)
    {
        reserve(n);
        for (int i = size; i < n; ++i)
            mas[i] = 0;
    }
}
 
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;
}
 
int& int_array::operator[] (size_t n)
{
    return mas[n];
}
 
const int& int_array::operator[] (size_t n) const
{
    return mas[n];
}
 
int& int_array::at(size_t n)
{
    if (n >= size)
        throw std::out_of_range("Index out of range!");
    return mas[n];
}
 
int_array& int_array::operator= (const int_array& in)
{
    int_array temp(in);
    temp.swap(*this);
    return *this;
}
 
void int_array::swap(int_array& in)
{
    std::swap(mas, in.mas);
    std::swap(size, in.size);
    std::swap(capacity, in.capacity);
}
 
void int_array::clear()
{
    size = 0;
}
 
void int_array::erase(size_t index)
{
    if (index >= size) 
        throw std::out_of_range("Index out of range!");
    --size;
    for (int i = index; i < size; ++i)
        mas[i] = mas[i + 1];
}
 
bool int_array::empty() const
{
    return size == 0;
}
 
int int_array::front() const
{
    return mas[0];
}
 
int int_array::back() const
{
    return mas[size-1];
}
 
int& int_array::front()
{
    return mas[0];
}
 
int& int_array::back()
{
    return mas[size-1];
}
Метки c++
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 12
Комментарии
  1. Старый комментарий
    Здравствуйте, Тамика. Приятно поучаствовать снова в Вашем блоге. Но есть вопрос, почему при очистке void clear, Вы чистите только счетчик?
    Запись от mustimur размещена 21.03.2014 в 18:56 mustimur вне форума
  2. Старый комментарий
    Раз <algorithm> подключен, можно тогда copy и fill использовать.
    В конструкторе может пригодиться
    C++
    1
    
    new int[n]()
    Насколько я знаю, конструктор копирования обычно capacity не копирует.
    Запись от Somebody размещена 21.03.2014 в 19:00 Somebody вне форума
  3. Старый комментарий
    Аватар для SatanaXIII
    1) В реализации метода pop_back()
    C++
    1
    
    if (size > 0)
    Не?

    2) Везде подряд сравнение signed int и size_t. Разве vector.size может быть отрицательным? А на шестидесяти четырех битных машинах size_t влезет в int? Не очень хорошо.

    3)
    C++
    1
    2
    
        int& int_array::front();
        int& int_array::back();
    В чем сакральный смысл? Если захочет сам себя развидеть? ))

    4) Если
    C++
    1
    
    void swap (int_array &in) throw ();
    тогда уж и в реализации добавить:
    C++
    1
    2
    3
    4
    5
    6
    
    void int_array::swap(int_array& in) throw()
    {
        std::swap(mas, in.mas);
        std::swap(size, in.size);
        std::swap(capacity, in.capacity);
    }
    Ну или просто в объявлении:
    C++
    1
    
    void __declspec(nothrow) swap (int_array &in) /*throw ()*/;
    Запись от SatanaXIII размещена 21.03.2014 в 22:13 SatanaXIII вне форума
  4. Старый комментарий
    C++
    1
    2
    3
    4
    5
    6
    
    int_array& int_array::operator= (const int_array& in)
    {
        int_array temp(in);
        temp.swap(*this);
        return *this;
    }
    опять начинаете крутить
    C++
    1
    2
    3
    
    int_array a;
    //добавляем 100500 элементов в a
    a = a;
    получаем ненужное копирование и свап с самим собой
    Запись от Jupiter размещена 21.03.2014 в 23:06 Jupiter вне форума
  5. Старый комментарий
    Цитата Сообщение от mustimur
    Здравствуйте, Тамика. Приятно поучаствовать снова в Вашем блоге. Но есть вопрос, почему при очистке void clear, Вы чистите только счетчик?
    И мне приятно снова видеть Вас в моём блоге.
    По поводу вопроса - clear() должен зачистить все элементы, но не удалять память и capacity, дабы избежать дальнейшего перевыделения.
    Запись от Тамика размещена 22.03.2014 в 10:17 Тамика вне форума
  6. Старый комментарий
    Цитата Сообщение от Somebody
    Раз <algorithm> подключен, можно тогда copy и fill использовать.
    В конструкторе может пригодиться
    C++
    1
    
    new int[n]()
    Насколько я знаю, конструктор копирования обычно capacity не копирует.
    По поводу copy/fill - я вообще не хотела никаких дополнительных библиотек подключать.)))
    Но меня уговорили ее подключить для свопа. Потому более я ее нигде не использую. И, наверное, уберу эту библиотеку в дальнейшем.
    По поводу capacity - я поняла о чём Вы. Да, это ценное замечание, будет исправлено!
    Запись от Тамика размещена 22.03.2014 в 10:20 Тамика вне форума
  7. Старый комментарий
    Цитата Сообщение от Jupiter
    опять начинаете крутить
    C++
    1
    2
    3
    
    int_array a;
    //добавляем 100500 элементов в a
    a = a;
    получаем ненужное копирование и свап с самим собой
    Да, if я зря убрала. Исправим.
    Спасибо!
    Запись от Тамика размещена 22.03.2014 в 10:22 Тамика вне форума
  8. Старый комментарий
    Цитата Сообщение от SatanaXIII
    1) В реализации метода pop_back()
    C++
    1
    
    if (size > 0)
    Не?

    2) Везде подряд сравнение signed int и size_t. Разве vector.size может быть отрицательным? А на шестидесяти четырех битных машинах size_t влезет в int? Не очень хорошо.


    3)
    C++
    1
    2
    
        int& int_array::front();
        int& int_array::back();
    В чем сакральный смысл? Если захочет сам себя развидеть? ))

    4) Если
    C++
    1
    
    void swap (int_array &in) throw ();
    тогда уж и в реализации добавить:
    C++
    1
    2
    3
    4
    5
    6
    
    void int_array::swap(int_array& in) throw()
    {
        std::swap(mas, in.mas);
        std::swap(size, in.size);
        std::swap(capacity, in.capacity);
    }
    Ну или просто в объявлении:
    C++
    1
    
    void __declspec(nothrow) swap (int_array &in) /*throw ()*/;
    1) А одно и то же.
    2) Да, хотела изменить тип переменных с int на size_t, но забыла... Исправим.)
    3) Сакральный смысл в том, чтобы можно было с помощью этих функций не только доставать значение, а ещё и изменять.
    4) Учту-с.
    Спасибо!
    Запись от Тамика размещена 22.03.2014 в 10:29 Тамика вне форума
  9. Старый комментарий
    Аватар для HighPredator
    Немного не по сути, но
    C++
    1
    2
    3
    
    #pragma once
    #ifndef _INT_ARRAY_
    #define _INT_ARRAY_
    overkill imho.
    Запись от HighPredator размещена 23.03.2014 в 12:28 HighPredator вне форума
  10. Старый комментарий
    Аватар для SatanaXIII
    Цитата Сообщение от Тамика
    3) Сакральный смысл в том, чтобы можно было с помощью этих функций не только доставать значение, а ещё и изменять.
    Это все здорово, но зачем явно указывать область видимости? Оно вроде как подразумевается.
    Запись от SatanaXIII размещена 24.03.2014 в 12:40 SatanaXIII вне форума
  11. Старый комментарий
    Это все здорово, но зачем явно указывать область видимости? Оно вроде как подразумевается.
    А это моя невнимательность!
    Запись от Тамика размещена 26.03.2014 в 16:37 Тамика вне форума
  12. Старый комментарий
    Аватар для Avazart
    overkill imho.
    А по моему вполне нормально #pragma once обрабатывается вроде как быстрее чем обычные гуарды, но некоторые компиляторы её могут просто игнорить.
    Запись от Avazart размещена 25.04.2015 в 12:28 Avazart вне форума
 
Новые блоги и статьи
Мастера простых решений
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
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru