Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.97
Juni85
1 / 1 / 0
Регистрация: 22.12.2009
Сообщений: 6
#1

Динамический массив - C++

27.08.2010, 21:15. Просмотров 4093. Ответов 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:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
27.08.2010, 21:26     Динамический массив #2
Цитата Сообщение от Juni85 Посмотреть сообщение
Библиотека <vector> это конечно хорошо, но почему изменение длины массива не реализовано в стандартной библиотеке
А resize по-Вашему что делает?
ForEveR
27.08.2010, 21:35
  #3

Не по теме:

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

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

...

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

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

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

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

Всего этого может и не быть. Простейшие реализации могут копировать данные при каждом изменении размера.
Дополнительно можете почитать про функции вектора resize, reserve, capacity.
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 426
06.04.2011, 10:34     Динамический массив #7
вот тоже пытался обойтись без 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
-=ЮрА=-
Заблокирован
Автор FAQ
06.04.2011, 10:43     Динамический массив #8
Структура объявляется так
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 конфигурации
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 426
07.04.2011, 21:15     Динамический массив #9
то то и оно что вроде так же только ошибка сбоя . Работаю в 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 выделения памяти?
-=ЮрА=-
Заблокирован
Автор FAQ
08.04.2011, 11:19     Динамический массив #10
delete [] выполняет очистку памяти которая была выделена под объект, ели память не выделялась это приведёт к ошибке!!!!Посмотри свой код, очень вероятно что ты сам накосячил и детальный анализ позволит это выявить!
schoolboy_
1 / 1 / 0
Регистрация: 02.03.2013
Сообщений: 59
30.03.2013, 16:06     Динамический массив #11
У меня такой вопрос:
стоит ли тратить время на изучения динамических массивов, если есть шаблонный класс vector?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 16:21     Динамический массив
Еще ссылки по теме:

динамический массив C++
C++ Динамический массив
Динамический массив C++
C++ Gets и динамический массив
C++ Статический массив в динамический массив

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
12890 / 7276 / 811
Регистрация: 27.09.2012
Сообщений: 17,975
Записей в блоге: 2
Завершенные тесты: 1
30.03.2013, 16:21     Динамический массив #12
Цитата Сообщение от 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;
}
Yandex
Объявления
30.03.2013, 16:21     Динамический массив
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru