|
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
|
|
| 27.08.2010, 21:15 | |
|
Ответы с готовыми решениями:
11
Создать динамический класс Book, содержащий динамический массив Authors |
| 27.08.2010, 21:35 | |
|
Не по теме: CyBOSSeR, По-моему ТС спрашивает не про STL... Ну как мне кажется
1
|
|
|
|
|
| 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 [ТС] | ||||
|
Всем большая благодарность от меня за Ваши ответы. Вот еще что мне ответили на другом форуме:
Добавлено через 2 минуты
1
|
||||
|
|
||
| 28.08.2010, 03:06 | ||
|
Как в паскале это принято делать не знаю, думаю, что алгоритмы везде одинаковые, но в том же векторе происходит примерно следующее. Сначала резервируется некоторое количество памяти (этого может и не делаться) как бы про запас. Если нужно уменьшить размер вектора, то память скорее всего перераспределяться не будет, а просто изменится значение переменной хранящей размер. При увеличении размера захватывается опять большее количество памяти, чем необходимо конкретно в этот момент. Если нужно увеличить размер на большее количество байт, чем доступно в резерве, то происходит перераспределение памяти (по стандарту данные в векторе должны храниться последовательно, поэтому нельзя выделить новый кусок где попало). Вот в этом моменте, как раз таки и создается временный второй контейнер для хранения данных. Таким образом удается избежать постоянного копирования во временный массив. Всего этого может и не быть. Простейшие реализации могут копировать данные при каждом изменении размера. Дополнительно можете почитать про функции вектора resize, reserve, capacity.
1
|
||
|
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
|
||||||
| 06.04.2011, 10:34 | ||||||
|
вот тоже пытался обойтись без vector на C++
Создал динамический массив структур. А на 1-же изменении размера - ошибка.
Кстати, так и не знаю, что будет если деструктор delete вызывать до выделения памяти new
0
|
||||||
|
|
||||||
| 06.04.2011, 10:43 | ||||||
|
Структура объявляется так
0
|
||||||
|
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
|
||||||
| 07.04.2011, 21:15 | ||||||
|
то то и оно что вроде так же только ошибка сбоя . Работаю в C++ Builder .Привожу кусок хэдера и файла cpp
0
|
||||||
|
|
|
| 08.04.2011, 11:19 | |
|
delete [] выполняет очистку памяти которая была выделена под объект, ели память не выделялась это приведёт к ошибке!!!!Посмотри свой код, очень вероятно что ты сам накосячил и детальный анализ позволит это выявить!
0
|
|
|
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
|
|
| 30.03.2013, 16:06 | |
|
У меня такой вопрос:
стоит ли тратить время на изучения динамических массивов, если есть шаблонный класс vector?
0
|
|
|
Неэпический
|
|||||||
| 30.03.2013, 16:21 | |||||||
|
Не по теме: стоит ли учить математику, если есть калькулятор? vector удобен для разработки программ, но изучение работы с памятью ведет к понимаю работы и самого вектора. А когда знаешь как работает тот или иной элемент искать ошибки гораздо проще, да и программу писать тоже. Добавлено через 4 минуты Те, кто изучает контейнеры, не понимая даже как это всё внутри примерно работает, очень удивляются, что такой код не работает:
1
|
|||||||
| 30.03.2013, 16:21 | |
|
Помогаю со студенческими работами здесь
12
Создать динамический класс Book, содержащей динамический массив Authors Можно ли в классе создавать массив переменной длинны. Например динамический массив? Скопировать динамический массив в другой массив только с положительными элементами из первого Заполнить динамический массив из файла и записать массив обратно в файл Написать функцию принимающую массив и возвращающую указатель на динамический массив Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 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?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|