Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 15.02.2025
Сообщений: 10

Является ли vector примером динамического массива?

17.02.2025, 19:33. Показов 8108. Ответов 72
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Является ли vector примером динамического массива? Вопрос может звучать странно и я вижу в нем однозначный ответ, что вектор все таки является примером динамического массива, но все равно, хотелось бы убедиться, потому что мнения в интернете расходятся (Готовлюсь к зачету в унике, вопросы по теории это бред, из-за формулировки некоторых нельзя дать однозначный ответ, поэтому не бейте палками)

В каких строках приведен пример динамического массива?
C++
1
2
3
4
int* arr = new int [M]{ 0 };
 vector <double> vec= {1.4, 2.0, 3.9, 4.1};
 char arr[4]{ 'k', 'b', 'c', '_' };
 char* vec = new int[6];
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2025, 19:33
Ответы с готовыми решениями:

Является ли такое решение задачи примером динамического программирования?
Задали такую задачку: У вас есть несколько камней известного веса W1, …, Wn. Напишите программу, которая распределит камни в две кучи...

Что является причиной ошибки после завершения всех операций? (динамический массив)
Что является причиной ошибки после завершения всех операций? (динамический массив) #include &lt;iostream&gt; #include...

Собственный динамический массив (аналог std::vector)
Вот возникла идея написать что-то на подобии вектора, но возникла проблема что не так с kallocSize? Почему компилятор ее не пропускает? А...

72
18.02.2025, 14:28
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
Там оно таки называется array
думаю это уже можно считать вбросом )))
Цитата Сообщение от Annemesski Посмотреть сообщение
тут должен быть троллолоидный наброс на тему "PHP - это не язык программирования" )))

0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
18.02.2025, 15:07
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В gcc c17 затирает данные за хвостом вектора
И? Это документированное поведение.
0
 Аватар для Annemesski
2689 / 1346 / 485
Регистрация: 08.11.2016
Сообщений: 3,734
18.02.2025, 15:14
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В gcc c17
нет векторов
Цитата Сообщение от CoderHuligan Посмотреть сообщение
это хорошо видно в дебаггере
опять 25 (35?) нашли где смотреть, уверены что в релизе реализация вектора что-то там делает с хвостом и что поведение в другом дебагере точно такое же?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.02.2025, 17:14

Не по теме:

Не по теме:

Цитата Сообщение от alexu_007 Посмотреть сообщение
Как там всё устроено внутри (в куче, не в куче) - кому это интересно?
Опять "школота" набежала...


Цитата Сообщение от Annemesski Посмотреть сообщение
думаю это уже можно считать вбросом )))
Тут 90% вбросов.



Цитата Сообщение от Royal_X Посмотреть сообщение
будут рассказывать, что в С++ нет динамических массивов
Я вот тут подумал, что хоть массив нельзя создать в куче прямо и получить указатель на него.
Поэтому как бы можно было бы посчитать что динамических массивов в чистом виде нет.
Не прибегая ко всяким кастам, placement new и другим извращениям.

Как бы вроде способ, хоть и костыльный :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
template<class T>
T* make_array(){
   return new T[1]{};
}
template<class T>
void release_array(T* p){
   delete [] p;
}
 
int main(){
   using arr = int[5];
   using arr2d = int[5][5];
 
   arr * d1= make_array<arr>();
   release_array(d1);
   arr2d * d2= make_array<arr2d>();
   release_array(d2);
   std::cout << (*d2)[4][4];
}
Интересно, насколько можно утверждать, что я создал динамический массив?
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
18.02.2025, 17:22
Цитата Сообщение от Annemesski Посмотреть сообщение
нашли где смотреть
Дебаггер показывает реальную картину.
Цитата Сообщение от SmallEvil Посмотреть сообщение
можно утверждать, что я создал динамический массив?
Это типизированный массив - статический массив, но только в куче.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3037 / 1054
Регистрация: 01.06.2021
Сообщений: 11,569
18.02.2025, 17:31
Цитата Сообщение от SmallEvil Посмотреть сообщение
динамический массив
а такой термин вообще есть в стандарте? насколько мне известно, нет. А следовательно, каждый волен сам считать, что есть "динамическим" массивом. Для меня, если мы можем указать его размер в рантайме, а также, если мы можем удалять и вставлять элементы, то он уже динамический, и не важно, как он там внутренне реализован.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.02.2025, 17:37
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Очевидно же, что вектор в c++ не является динамической структурой данных.
И при чём тут "динамической структурой данных"?
Ты теплое с мягким попутал

Добавлено через 1 минуту
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Дебаггер показывает реальную картину.

Астанавите, Вите надо выйти. ))

Добавлено через 1 минуту
Цитата Сообщение от Royal_X Посмотреть сообщение
Для меня, если мы можем указать его размер в рантайме
Особенность массивов (в с++) в том, что как раз таки нельзя указать размеры в рантайме.
0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
18.02.2025, 20:43
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В C и C++ вообще нет поддержки массивов. Это чистое заблуждение. Там есть последовательности однотипных элементов, которые по недоразумению обозвали массивами. Настоящий массив должен быть отдельным типом, и его можно передавать в качестве аргумента функции одним параметром. А функция могла бы работать с любым размером массива. В С приходиться передавать указатель на первый элемент последовательности и в качестве второго аргумента его длину. При этом длина статического массива семантически оторвана от самого массива. То есть сам массив ничего не знает о своей длине.
массивы существуют.

Можно передать и по значению (в составе структуры) и по указателю/ссылке на массив

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
#include <stdio.h>
 
struct S
{
    int arr[3][4][5];
};
 
void func1(int(*arr)[3][4][5])
{
    printf("size in bytes==%zu\n", sizeof *arr);
    printf("dim0==%zu\n", sizeof *arr / sizeof **arr);
    printf("dim1==%zu\n", sizeof **arr / sizeof ***arr);
    printf("dim2==%zu\n", sizeof ***arr / sizeof ****arr);
}
 
void func2(struct S* s)
{
    printf("size in bytes==%zu\n", sizeof s->arr);
    printf("dim0==%zu\n", sizeof s->arr / sizeof *s->arr);
    printf("dim1==%zu\n", sizeof *s->arr / sizeof **s->arr);
    printf("dim2==%zu\n", sizeof **s->arr / sizeof ***s->arr);
}
 
int main(void)
{
    int arr[3][4][5]={0};
    func1(&arr);
    
    struct S s={0};
    func2(&s);
}
https://onlinegdb.com/f4ExdpW3p

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
#include <iostream>
 
struct S
{
    int arr[3][4][5]{};
};
 
template<typename T>
void func1(T& arr)
{
    std::cout<<"size in bytes=="<<sizeof arr<<"\n";
    std::cout<<"dim0=="<< std::size(arr)<<"\n";
    std::cout<<"dim1=="<< std::size(*arr)<<"\n";
    std::cout<<"dim2=="<< std::size(**arr)<<"\n";
}
 
void func2(S& s)
{
    std::cout<<"size in bytes=="<<sizeof s.arr<<"\n";
    std::cout<<"dim0=="<< std::size(s.arr)<<"\n";
    std::cout<<"dim1=="<< std::size(*s.arr)<<"\n";
    std::cout<<"dim2=="<< std::size(**s.arr)<<"\n";
}
 
int main()
{
    int arr[3][4][5]{};
    func1(arr);
    
    S s;
    func2(s);    
}
https://onlinegdb.com/rAfA9MaFpE

size in bytes==240
dim0==3
dim1==4
dim2==5
size in bytes==240
dim0==3
dim1==4
dim2==5
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.02.2025, 21:52
Цитата Сообщение от SmallEvil Посмотреть сообщение
динамический массив
Цитата Сообщение от Royal_X Посмотреть сообщение
а такой термин вообще есть в стандарте?
А зачем такой термин? Он излишен.
Есть pointer.
Есть storage.

Всё можно ясно выразить.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
массивы существуют.
И Земля круглая, что ли?

Добавлено через 3 минуты
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Это типизированный массив - статический массив, но только в куче.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3037 / 1054
Регистрация: 01.06.2021
Сообщений: 11,569
18.02.2025, 22:23
Цитата Сообщение от SmallEvil Посмотреть сообщение
А зачем такой термин?
чтобы студент мог ответить на вопрос
Цитата Сообщение от nkrdd Посмотреть сообщение
Является ли vector примером динамического массива?
и иметь возможность отстоять свою позицию)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.02.2025, 00:28
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В gcc c17 затирает данные за хвостом вектора
Цитата Сообщение от KSergey9 Посмотреть сообщение
И? Это документированное поведение.
Поговорили о сферических конях.

При доступе к элементам вектора выше index < size() - поведение не определенно.
По вполне понятным причинам.
Говорить о каких то "затирает данные" "за хвостом", довольно глупо.
Цитата Сообщение от cppreference.com
Unlike std::map::operator[], this operator never inserts a new element into the container. Accessing a nonexistent element through this operator is undefined behavior.
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
19.02.2025, 11:54
Цитата Сообщение от Алексей1153 Посмотреть сообщение
массивы существуют.
Это дело привычки так называть.
C++
1
int arr[10];
Это не есть тип просто "массив". Это совершенно отдельный тип: массив из 10 элементов. Если вы попытаетесь передать в функцию массив из 11 элементов, получите по шапке от компилятора. То есть вывод такой: если вам нужно работать с массивом из 20 элементов, надо писать отдельную функцию, потому что это отдельный тип. Ну или пользоваться известными костылями, к которым все привыкли.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Говорить о каких то "затирает данные" "за хвостом", довольно глупо.
Почему глупо? Вектор как бы должен инкапсулировать некоторые вещи. В c++ вектор не есть полноценный динамический массив. Это нечто что недоработали. Как бы пользоваться можно, но следует учитывать, что вокруг сплошные мины.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.02.2025, 12:03
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Это нечто что недоработали.
Почитайте о создании STL. Какие цели ставились и как их добились.
Коротко.
Цели : универсальность, гибкость и производительность.
Подробнее погуглишь сам.

Я лично не вижу там ничего "недоработанного", что бы это ни значило.
Чего то может не хватает. Но то что уже есть, лучше не будет. Исходя их своего назначения.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
19.02.2025, 12:11
Цитата Сообщение от SmallEvil Посмотреть сообщение
Почитайте о создании STL. Какие цели ставились и как их добились.
Я изучаю.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я лично не вижу там ничего "недоработанного"
Как по мне вот такого быть не должно:
C++
1
2
std::vector<int> numbers {1, 2, 3, 4, 5};
numbers[5] = 9;
Размер по прежнему =5 элементам.
Подозреваю, что throw всё таки выбрасывается, так как в дебаггере я наткнулся на вызов throw. Однако никаких предупреждений от компилятора я явно не получил. и такая ошибка может оказаться незамеченной. По крайней мере можно было сделать так: если индекс выходит за пределы вектора, то неявно вызывается push_back().
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
19.02.2025, 12:20
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Подозреваю, что throw всё таки выбрасывается,
.at() проверяет границы, по документации
Также предполагаю, что есть опции компилятора проверять / не проверять границы в векторе (с ходу не нагуглилось чета)

Добавлено через 3 минуты
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В c++ вектор не есть полноценный динамический массив.
Еще раз. Не надо пороть ерундой.
Есть документированное поведение.
Если вы почему-то от вектора ожидаете другого поведения "потому что в языке Х то, что там названо массивом, работает вот так и я к этому привык" - то это, извините, сугубо ваши проблемы.
В С++ ожидаемое вами поведение документировано для map. Используйте map со всеми его недостатками, а вектор - он для другого. Что не мешает быть вектору абсолютно и полностью динамическим.
2
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3037 / 1054
Регистрация: 01.06.2021
Сообщений: 11,569
19.02.2025, 12:20
Цитата Сообщение от KSergey9 Посмотреть сообщение
at() проверяет границы
хотел тоже самое написать, но KSergey9 опередил

CoderHuligan, это сделано специально. Любая проверка влияет на производительность. Если нужны проверки, то используй at, которая выбросит исключение. Если ты уверен в своем коде, то используй [], который ничего не проверяет и поэтому быстрее at
2
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
19.02.2025, 12:30
Цитата Сообщение от CoderHuligan Посмотреть сообщение
То есть вывод такой: если вам нужно работать с массивом из 20 элементов, надо писать отдельную функцию, потому что это отдельный тип
в C++ пишется шаблон, и проблема решена
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.02.2025, 13:16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
в C++ пишется шаблон, и проблема решена
Плюс к этому из коробки учат разделять данные и алгоритмы.
Используем алгоритмы, одни и те же для разных данных.
Если нужен массив из 20 элементов - используем std::array из 20 элементов.
Нужен массив из N - используем std::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
#include <iostream>
#include <vector>
#include <algorithm>
 
template<class T>
class IDKVector{
public:
   T& operator[](size_t index){
      if (index >= data.size())
         data.resize(index+1);
      return data[index];
   };
   // отдаем для тех у кого с руками всё хорошо
   std::vector<T>& Data(){
      return data;
   }       
private: 
   std::vector<T> data;   
};
 
int main(){
   IDKVector<int> idkv;
   idkv[5] = 666; // бугага, кто тут БОСС?
   
   for(auto val : idkv.Data())
      std::cout << val << ' '; 
}

Теперь у меня вопрос. А кому оно надо в С++ то???
2
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
19.02.2025, 13:18
Цитата Сообщение от Royal_X Посмотреть сообщение
это сделано специально. Любая проверка влияет на производительность.
Если мне не нужны проверки я лучше обычный массив буду юзать. От вектора ожидаешь безопасности, чтобы ни случилось. Но, ладно, это всё философия.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
19.02.2025, 13:24
Цитата Сообщение от CoderHuligan Посмотреть сообщение
От вектора ожидаешь безопасности,
Мало ли чего я нафантазирую.
Есть документация, в ней написано что на самом деле надо ожидать, и если мои фантазии разбились об реальность - так это моя проблема.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Если мне не нужны проверки я лучше обычный массив буду юзать.
Зачем, если вектор очень удобно, красиво и волшебно реализует ту самую динамичность, о которой собственно и речь? push_back, insert и вот это всё.
Да даже банальный resize уже готов и оттестирован, зачем массив??
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2025, 13:24

Скорость работы std::vector и обычного динамического массива
Всем привет! Есть задача по мат.моделированию, размер сетки 100х50. Использовались обычные динамические массивы: double ***n; ...

Динамические массивы типа vector и array
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;array&gt; #include &lt;string&gt; using namespace std; int main() { const int...

Как правильно записывать в динамический массив типа класса обьекты? вот банальный пример
#pragma once #include &quot;iostream&quot; namespace Program { class Book { typedef unsigned int ui; private:

Реализовать шаблон класса vector, реализующий динамический массив
Реализовать шаблон класса vector, реализующий динамический массив. Определить 2 объекта класса vector и внешнюю функцию, выполняющую...

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru