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

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

Запись от Тамика размещена 21.03.2014 в 18:12
Показов 5288 Комментарии 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 вне форума
 
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru