Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238

Как работает vector?

29.10.2019, 20:02. Показов 5422. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотел для себя разобраться как работает vector , получилось что-то такое,я в правильном направлении думаю?
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
#include <iostream>
int size = 0;
template<class type>
class t{
private:
  
  struct obj
  {
    type * t;
    obj * next;
  };
 
  obj * first = new obj;
  obj * last = new obj;
  
 public :
 ~ t(){
    obj * q = first;
    for(int i = 0; i < size; i ++){
      obj * o = q->next;
      std::cout << q<< std::endl;
      delete q;
      q = o;
    }
  }
 void add(type ob){
   if(size == 0){
     last->t = &ob;
     first = last;
     std::cout << first << std::endl;
     size++;
   }
   else
   {
     obj * o = new obj;
     std::cout << o << std::endl;
     o->t = &ob;
     last->next = o;
     last = o;
     size++;
   }
 }
  type& operator[](int num){
    obj * q = first;
    for(int i = 0; i < num-1; i ++){
      q = q->next;
    }
    return *q->t;
  }
};
int main(){
  t<int>vec;
  int a = 6;
  int q = 153;
  std::cout << sizeof(vec) << std::endl;
   for(int i = 0;i <5;i++ ){
     vec.add((int)i);
   }
   for(int x = 1;x <=5;x++ ){
      std::cout << vec[x]  << std::endl;
   }
  return 0; 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2019, 20:02
Ответы с готовыми решениями:

Не работает функция sort (vector, vector)
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;algorithm&gt; using namespace std; class...

STL, vector. iterator. как работает?
void invertArrange() //метод инвертирования порядка слов { istringstream ist(operLine);...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

53
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
30.10.2019, 13:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
К тому же стек обычно не резиновый.
Здесь отлично monotonic вписался бы)
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
30.10.2019, 13:40
Цитата Сообщение от Croessmah Посмотреть сообщение
Но всё равно созданные ноды нельзя будет удалить из вектора, т.к. другие в таком случае протухнут.
Так я и не спорю. Но тот же std::vector::clear() не обязан освобождать память. Я лишь пытался описать простую реализацию.
Цитата Сообщение от Croessmah Посмотреть сообщение
Ничто не мешает написать аллокатор, который будет отдавать память из готового пула и заюзать стандартный список.
Это несколько сложнее для новичка, хотя и безусловно правильнее.
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,138
30.10.2019, 13:43
Цитата Сообщение от Vanconts Посмотреть сообщение
если не будет last то как тогда добавлять новые элементы? их же нужно привязывать к последнему элементу
Найти последний и добавить к нему новый.

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

Само по себе понятие список не определяет функции добавления или удаления. Список - это не контейнер, а лишь абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного раза (википедия). Связные списки - это то же ещё не контейнер, а лишь динамическая структура данных задающая связи между элементами. Вы пытаетесь реализовать контейнер с однонаправленным списком и набором функций для работы над ним. Реализаций подобного может быть множество, для начала вам важно ухватить саму суть динамической структуры и реализовать базовые операции (добавление и удаление) с подобной структурой. Оптимизировать всё это хозяйство можно позже, если будет такое желание.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
30.10.2019, 13:51
Когда-то давно забавы ради реализовал свой vector, и list тоже, но исходники последнего найти не могу
Warning
Реализация несовместима с std::vector чуть менее, чем полностью

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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
template< typename T >
class kvector 
{
public:
    typedef T* iterator;
    typedef const T* const_iterator;
 
    kvector() 
    {
        _init(0);
    }
 
    kvector(size_t size) 
    {
        _init(size);
    }
    
    kvector(const kvector<T>& other)
    {
        _init(other.size()); 
        _copy_buf(m_buf, other.m_buf, other.size());
    }
    
    kvector(const_iterator begin, const_iterator end)
    {
        const size_t size = end - begin;
        _init(size); 
        _copy_buf(m_buf, begin, size);
    }
    
    kvector(kvector<T>&& other)
    {
        _move(other);
    }
 
    ~kvector() 
    {
       _free_all();
    }
    
    kvector<T>& operator=(const kvector<T>& other)
    {
        if (this != &other)
        {
            if (m_allocSize < other.size())
            {
                _free_all();
                _init(other.size()); 
            }
            else
            {
                if (m_size > other.m_size)
                    _destruct(&m_buf[other.m_size], m_size - other.m_size);
                m_size = other.m_size;
            }
            _copy_buf(m_buf, other.m_buf, other.size());
        }
        return *this;
    }
    
    kvector<T>& operator=(kvector<T>&& other)
    {
        if (this != &other)
        {
            _free_all();
            _move(other);
        }
        return *this;
    }
    
    T* data()
    {
        return m_buf;
    }
    
    T* data() const
    {
        return m_buf;
    }
 
    size_t size() const 
    {
        return m_size;
    }
 
    void push_back(const T& item) 
    {
        if (m_size == m_allocSize) 
            reserve(max(m_allocSize * 2, m_defaultSize));
        new (&m_buf[m_size++]) T(item);
    }
 
    T& operator[](const size_t idx) 
    {
        return m_buf[idx];
    }
 
    const T& operator[](const size_t idx) const 
    {
        return m_buf[idx];
    }
 
    const iterator begin() const 
    {
        return &m_buf[0];
    }
 
    const iterator end() const 
    {
        return &m_buf[m_size];
    }
 
    bool empty() const 
    {
        return (m_size == 0);
    }
 
    T& front() const 
    {
        return m_buf[0];
    }
 
    T& back() const 
    {
        return m_buf[m_size - 1];
    }
 
    void pop_back() 
    {
        _destruct(&m_buf[--m_size], 1);
    }
 
    void clear() 
    {
        _destruct(m_buf, m_size);
        m_size = 0;
    }
 
    void clear_and_free() 
    {
        _free_all();
        _init(0);
    }
 
    void resize(size_t size) 
    {
        reserve(size);
        if (size < m_size)
            _destruct(&m_buf[size], m_size - size);
        else if (size > m_size)
            _construct(&m_buf[m_size], size - m_size);
        m_size = size;
    }
    
    void reserve(size_t size)
    {
        if (size > m_allocSize) 
        {
            auto tmp = _alloc(size);
            if (m_buf != nullptr)
            {
                _move_buf(tmp, m_buf, m_size);
                _free_all();
            }
            m_buf = tmp;
            m_allocSize = size;
        }
    }
 
private:
    T* m_buf;
    size_t m_allocSize;
    size_t m_size;
    static const size_t m_defaultSize = std::is_trivial<T>::value ? 16 : 1;
 
private:
    T* _alloc(size_t size)
    {
        return reinterpret_cast<T*>(new char[size * sizeof(T)]);
    }
    
    void _free(T* p)
    {
        delete[] reinterpret_cast<char*>(p);
    }
    
    template<typename DestructType>
    void _destruct(DestructType* p, size_t size,
        typename std::enable_if<!std::is_trivial<DestructType>::value>::type* = nullptr)
    {
        for (size_t i = 0; i < size; i++)
            p[i].~T();
    }
    
    template<typename DestructType>
    void _destruct(DestructType*, size_t,
        typename std::enable_if<std::is_trivial<DestructType>::value>::type* = nullptr)
    {
    }
    
    template<typename ConstructType>
    void _construct(ConstructType* p, size_t size,
        typename std::enable_if<!std::is_trivial<ConstructType>::value>::type* = nullptr)
    {
        for (size_t i = 0; i < size; ++i)
            new (&p[i]) T;
    }
    
    template<typename ConstructType>
    void _construct(ConstructType*, size_t,
        typename std::enable_if<std::is_trivial<ConstructType>::value>::type* = nullptr)
    {
    }
    
    void _free_all()
    {
        if (m_buf != nullptr)
        {
            _destruct(m_buf, m_size);
            _free(m_buf);
        }
    }
    
    void _init(size_t size) 
    {
        m_buf = (size > 0) ? _alloc(size) : nullptr;
        m_allocSize = size;
        m_size = size;
        _construct(m_buf, size);
    }
    
    void _move(kvector<T>& other) 
    {
        m_buf = other.m_buf;
    m_allocSize = other.m_allocSize;
        m_size = other.m_size;
        other._init(0);
    }
    
    template<typename CopyType>
    void _move_buf(CopyType* to, CopyType* from, size_t size, 
        typename std::enable_if<std::is_trivial<CopyType>::value>::type* = nullptr)
    {
        memcpy(to, from, size * sizeof(CopyType));
    }
    
    template<typename CopyType>
    void _move_buf(CopyType* to, CopyType* from, size_t size, 
        typename std::enable_if<!std::is_trivial<CopyType>::value>::type* = nullptr)
    {
        while(size--)
        {
            new (to) T(std::move(*from));
            to++;
            from++;
        }
    }
    
    template<typename CopyType>
    void _copy_buf(CopyType* to, const CopyType* from, size_t size, 
        typename std::enable_if<std::is_trivial<CopyType>::value>::type* = nullptr)
    {
        memcpy(to, from, size * sizeof(CopyType));
    }
    
    template<typename CopyType>
    void _copy_buf(CopyType* to, const CopyType* from, size_t size, 
        typename std::enable_if<!std::is_trivial<CopyType>::value>::type* = nullptr)
    {
    copy(from, from + size, to);
    }
};
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
30.10.2019, 17:10  [ТС]
oleg-m1973, так что в моем коде стоит изменить?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 17:31
Цитата Сообщение от Vanconts Посмотреть сообщение
oleg-m1973, так что в моем коде стоит изменить?
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
template <typename T>
class CSingleLinkedList
{
public:
    struct CNode
    {
        CNode(T val)
        : m_val(std::move(val))
        {
        }
 
        T m_val;
        CNode *m_next = nullptr;
    };
 
    ~CSingleLinkedList()
    {
        while (m_head)
            delete std::exchange(m_head, m_head->m_next);
    }
 
    void push_back(T val)
    {
        CNode *node = new CNode(std::move(val));
        if (!m_head)
            m_head = m_tail = node;
        else
            m_tail = m_tail->m_next = node;
    }
 
    std::unique_ptr<CNode> pop_front()
    {
        if (!m_head)
            return nullptr;
 
        std::unique_ptr<CNode> sp(m_head);
        m_head = m_head->m_next;
        if (!m_head)
            m_tail = nullptr;
        return sp;
    }
    
protected:
    CNode *m_head = nullptr;
    CNode *m_tail = nullptr;
};
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
30.10.2019, 20:34  [ТС]
oleg-m1973, но Ваш код работает почти так же
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 20:37
Цитата Сообщение от Vanconts Посмотреть сообщение
oleg-m1973, но Ваш код работает почти так же
Почти также как что?
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
30.10.2019, 22:18  [ТС]
oleg-m1973, как тот который я скинул
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 22:28
Цитата Сообщение от Vanconts Посмотреть сообщение
oleg-m1973, как тот который я скинул
Возможно я что-то пропустил, но - это который в первом посте? А в чём там сходство?
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
30.10.2019, 23:22  [ТС]
oleg-m1973, ну смысл похожий, просто Ваш код выглядит(да и работает) лучше, сходство в многом, как добавляется объект, сама структура, у меня только небыло pop'а
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
30.10.2019, 23:36
Цитата Сообщение от Vanconts Посмотреть сообщение
сходство в многом
Да?
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
30.10.2019, 23:44  [ТС]
Croessmah, ну а в чем отличие?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.10.2019, 10:26
Цитата Сообщение от Vanconts Посмотреть сообщение
oleg-m1973, ну смысл похожий, просто Ваш код выглядит(да и работает) лучше, сходство в многом, как добавляется объект, сама структура, у меня только небыло pop'а
Единственное сходство - что в ноде и у тебя и у меня есть указатель next (ну, иначе бы я не понял, что ты пытаешься сделать односвязный список). Собственно, это всё.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.10.2019, 10:26

Как сложить два vector и записать в третий vector ?
Не получается сложить два вектора по элементно и записать в третий . Складываю уже переведенные числа из десятичной в восьмеричной системе...

Как корректно скопировать vector в vector внутри класса
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt; codeList); ~test(); ...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Как обращаться к vector<vector>?
добрый день не подскажите, как обращаться к такой структуре: vector&lt;vector&lt;pair&lt;bool, string&gt;&gt;&gt; v; v....

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...


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

Или воспользуйтесь поиском по форуму:
54
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru