Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

27.08.2010, 21:15. Просмотров 4632. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2010, 21:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамический массив (C++):

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

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

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

динамический массив (Целое число разложить на массив простых множителей) - C++
Доброго времени суток всем. Целое число необходимо разложить на массив простых множителей. Столкнулся с проблемой, мне нужно, чтобы...

Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла - C++
задача: передать динамический массив в функцию, и записать в каждый элемент строку из файла. количество строк известно вот что у меня...

Как преобразовать массив в динамический? Массив вычисляет сумму элементов каждой диагонали матрицы - C++
Ошибка : Вызвано исключение по адресу 0x00BB2F4F в Проект6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE05. #...

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

Не по теме:

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

1
fasked
Эксперт С++
4963 / 2543 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.08.2010, 21:49 #4
Juni85, в Си для динамического выделения и освобождения памяти исопльзовались функции malloc, free. Для перераспределения размера массива можно было воспользоваться функцией realloc. Но дело в том, что эти функции были функциями стадартной библиотеки, а не штатными средствами языка.
В Си++ операторы new и delete сделаны уже языковыми средствами. Но оператора перераспределения памяти нет.
Ведь и правда, зачем он нужен, если есть шаблонные контейнеры STL (а-ля std::vector). Пользоваться ими гораздо удобнее, чем манипулировать простыми массивами данных.
1
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 создает второй массив новой длины и копирует данные с первого и переписывает указатель?
Думаю здесь можно поставить +
1
fasked
Эксперт С++
4963 / 2543 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.08.2010, 03:06 #6
Цитата Сообщение от Juni85 Посмотреть сообщение
может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?
Существует много методов перераспределения памяти. Зависит от конкретной реализации.
Как в паскале это принято делать не знаю, думаю, что алгоритмы везде одинаковые, но в том же векторе происходит примерно следующее.
Сначала резервируется некоторое количество памяти (этого может и не делаться) как бы про запас. Если нужно уменьшить размер вектора, то память скорее всего перераспределяться не будет, а просто изменится значение переменной хранящей размер. При увеличении размера захватывается опять большее количество памяти, чем необходимо конкретно в этот момент. Если нужно увеличить размер на большее количество байт, чем доступно в резерве, то происходит перераспределение памяти (по стандарту данные в векторе должны храниться последовательно, поэтому нельзя выделить новый кусок где попало). Вот в этом моменте, как раз таки и создается временный второй контейнер для хранения данных.

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

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

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) - C++
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если в массиве чётных чисел оказалось...

Двумерный массив (поменять статический массив на динамический) - C++
Нужно поменять статический массив на динамический с выделением памяти #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; ...

Массив и память. Как создать динамический массив? - C++
не могу исправить ошибки. И нужен динамический массив я что-то попробовала для его создания но ничего не вышло #include &quot;stdafx.h&quot; ...

Переделать динамический массив на статический массив - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int main() { int dim, counter_1 = 1, counter_2 =...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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