С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/33: Рейтинг темы: голосов - 33, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 22.12.2009
Сообщений: 6

Динамический массив

27.08.2010, 21:15. Показов 6871. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я постоянно работаю с динамическими массивами в Object Pascal и PHP. Вот внезапно возникла необходимость использования языка C++ и пришлось немного почесать голову )). :confused:

Библиотека <vector> это конечно хорошо, но почему изменение длины массива не реализовано в стандартной библиотеке. А ведь C++ самый успешный и развивающийся язык программирования.

Учитывая тот факт что в С++ можно объявить массив где угодно в теле алгоритма, то преимущества динамического массива перед статическими сужаются к двум:
1. можно создавать (суб)подмассивы произвольной длинны (в принципе существенный фактор);
2. тут же удалить массив из памяти после выполнения необходимых операций (не дожидаясь конца функции и т.п.).

А для Object Pascal преимущества динамического массива увеличиваются как минимум на два:
3. не занимает памяти, пока массив не востребован, т.е. не задана длинна (большой бонус, поскольку переменные объявляются только в разделе var и занимают память от начала алгоритма);
4. можно сколь угодно удлинять и укорачивать массив без потери данных в пределах усечения ( пример SetLength(Massiv, 1) ).

Резонные вопросы:
1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?
2. или забросили и недоделали данную операцию в С++ поскольку была библиотека <vector> (бред какой-то)? :eek:

Ответы на свои вопросы искал заранее, но нигде ничего не нашел. Может Вы, где что видели или знаете? Заранее благодарен. :rolleyes:
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.08.2010, 21:15
Ответы с готовыми решениями:

Динамический массив при наследовании, элементами которого являются объекты класса наследника динамический массив
Попробовал создать динамический массив, у которого элементы - объекты класса динамический массив, причем использовал класс-наследник от...

Динамический массив ,элементами которого являются объекты класса динамический массив
Доброго времени суток, захотел создать динамический массив ,элементами которого являются объекты класса динамический массив, если...

Создать динамический класс Book, содержащий динамический массив Authors
Мне нужно написать программу,а я не знаю как ее написать. Знаю, тут люди за кого-то не делают, укажите хотя бы направление. вот сама...

11
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
27.08.2010, 21:26
Цитата Сообщение от Juni85 Посмотреть сообщение
Библиотека <vector> это конечно хорошо, но почему изменение длины массива не реализовано в стандартной библиотеке
А resize по-Вашему что делает?
0
27.08.2010, 21:35

Не по теме:

CyBOSSeR, По-моему ТС спрашивает не про STL... Ну как мне кажется

1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
27.08.2010, 21:49
Juni85, в Си для динамического выделения и освобождения памяти исопльзовались функции malloc, free. Для перераспределения размера массива можно было воспользоваться функцией realloc. Но дело в том, что эти функции были функциями стадартной библиотеки, а не штатными средствами языка.
В Си++ операторы new и delete сделаны уже языковыми средствами. Но оператора перераспределения памяти нет.
Ведь и правда, зачем он нужен, если есть шаблонные контейнеры STL (а-ля std::vector). Пользоваться ими гораздо удобнее, чем манипулировать простыми массивами данных.
1
1 / 1 / 0
Регистрация: 22.12.2009
Сообщений: 6
28.08.2010, 02:30  [ТС]
Всем большая благодарность от меня за Ваши ответы. Вот еще что мне ответили на другом форуме:
вообще говоря, нельзя просто так нарастить длинну массива, потому что элементы любого массива располагаются в памяти последовательно, а гарантий того, что последующие ячейки памяти не будут заняты - нет.

...

C++ - это использование STL для работы с контейнерами.
операции new и delete растут из Си с malloc и free

в vector расширение памяти под хранимые объекты можно производить как явно, так и не явно, так что всё есть в C++
Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
Ведь и правда, зачем он нужен, если есть шаблонные контейнеры STL (а-ля std::vector). Пользоваться ими гораздо удобнее, чем манипулировать простыми массивами данных.
Осваиваю шаблон, в Object Pascal такого вроде нет, ну по крайней мере такую литературу не встречал и с ним не работал.

Добавлено через 2 минуты
Цитата Сообщение от Juni85 Посмотреть сообщение
1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?
Думаю здесь можно поставить +
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
28.08.2010, 03:06
Цитата Сообщение от Juni85 Посмотреть сообщение
может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?
Существует много методов перераспределения памяти. Зависит от конкретной реализации.
Как в паскале это принято делать не знаю, думаю, что алгоритмы везде одинаковые, но в том же векторе происходит примерно следующее.
Сначала резервируется некоторое количество памяти (этого может и не делаться) как бы про запас. Если нужно уменьшить размер вектора, то память скорее всего перераспределяться не будет, а просто изменится значение переменной хранящей размер. При увеличении размера захватывается опять большее количество памяти, чем необходимо конкретно в этот момент. Если нужно увеличить размер на большее количество байт, чем доступно в резерве, то происходит перераспределение памяти (по стандарту данные в векторе должны храниться последовательно, поэтому нельзя выделить новый кусок где попало). Вот в этом моменте, как раз таки и создается временный второй контейнер для хранения данных.

Таким образом удается избежать постоянного копирования во временный массив.

Всего этого может и не быть. Простейшие реализации могут копировать данные при каждом изменении размера.
Дополнительно можете почитать про функции вектора resize, reserve, capacity.
1
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
06.04.2011, 10:34
вот тоже пытался обойтись без vector на C++
Создал динамический массив структур. А на 1-же изменении размера - ошибка.
C++
1
2
3
4
char c; float p; char kd[20];
           } *smv;
...
delete [] smv; smv=new SMV[m];
не помогает отбрасывание [] т.е delete smv;
Кстати, так и не знаю, что будет если деструктор delete вызывать до выделения памяти new
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
06.04.2011, 10:43
Структура объявляется так
C++
1
2
3
4
5
6
7
typedef struct tagSOME_STRUCT
{
//struct arguments
} SOME_STRUCT;
//Выделение памяти под массив структур SOME_STRUCT
SOME_STRUCT * pSTRUCT = new SOME_STRUCT[n];
delete [] pSTRUCT;//в Debug-e будет выскакивать ошибка, память чистится для Release конфигурации
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
07.04.2011, 21:15
то то и оно что вроде так же только ошибка сбоя . Работаю в C++ Builder .Привожу кусок хэдера и файла cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
typedef struct SMV {
 char c; float p; char kd[20];
           } smv;
smv *sm;
 redim(); 
---------------------
TForm1::redim()
{
 m=csN->Value;
 delete [] sm;
 sm=new smv[m];
...
}
ошибка после new . Может мешает вызов delete до 1 выделения памяти?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.04.2011, 11:19
delete [] выполняет очистку памяти которая была выделена под объект, ели память не выделялась это приведёт к ошибке!!!!Посмотри свой код, очень вероятно что ты сам накосячил и детальный анализ позволит это выявить!
0
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
30.03.2013, 16:06
У меня такой вопрос:
стоит ли тратить время на изучения динамических массивов, если есть шаблонный класс vector?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
30.03.2013, 16:21
Цитата Сообщение от schoolboy_ Посмотреть сообщение
стоит ли тратить время на изучения динамических массивов, если есть шаблонный класс vector?

Не по теме:

стоит ли учить математику, если есть калькулятор?


vector удобен для разработки программ, но изучение работы с памятью ведет к понимаю работы и самого вектора. А когда знаешь как работает тот или иной элемент искать ошибки гораздо проще, да и программу писать тоже.

Добавлено через 4 минуты
Те, кто изучает контейнеры, не понимая даже как это всё внутри примерно работает, очень удивляются, что такой код не работает:
C++
1
2
3
4
5
6
7
#include <string>
#include <cstdio>
int main(){
    std::string str;
    scanf("%s",&str[0]);
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2013, 16:21
Помогаю со студенческими работами здесь

Создать динамический класс Book, содержащей динамический массив Authors
всем привет. может кто-то набросать код для такой вот задачи: Создать динамический класс Book, содержащей динамический массив...

Можно ли в классе создавать массив переменной длинны. Например динамический массив?
Динамические массивы привлекают больше. :)

Скопировать динамический массив в другой массив только с положительными элементами из первого
Пользователь вводит размер массива и сам массив. Программа копирует в другой массив только положительные элементы из первого. Оба массива...

Заполнить динамический массив из файла и записать массив обратно в файл
Подскажите пожалуйста функцию которая будет заполнять Динамический массив из файла и обратную которая этот массив запишет в файл=)

Написать функцию принимающую массив и возвращающую указатель на динамический массив
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые n нaибольших чисел. Как сделать...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru