Увеличение динамического массива в С++
Пример
int *a;
a =new int [10];
for(int i=0;i<10;i++)
a=i;
a=new int [20];//тут вся информация исчезает
for(int i=10;i<20;i++)
a=i;
#include <vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> coll;
for(int i = 0;i < 10;++i)
coll.push_back(i);
coll.push_back(10);
coll.push_back(22);
for(int i = 0;i < coll.size();++i)
cout<<coll<<' ';
cout<<endl;
return 0;
}
{
string hostname;
string nserver;
string devid;
string fixaddr;
};
vector<sHosts>hosts;
Ну или можно исспользовать указатель на тип (который сам по себе тип но у него есть оператор присваивания). ))
Информация не исчезает, а просто становится недоступной, потому что выделяется новый блок, но в программе отсутствует указатель на старый блок - утечка памяти.
Для простых типов данных можно использовать функцию realloc
int *array = (int*) malloc (10 * sizeof (int));
// изменяем размер блока выделенной памяти
array = (int*) realloc (array, 20 * sizeof (int));
// освобождаем память
free (array)
При увеличении блока, функция может выполнить перемещение данных в бо'льшую область памяти.
Данные функции не обнуляют выделенную память и не вызывают ни конструкторы, ни деструкторы (в отличие от new[] и delete[]) - поэтому их очень сложно использовать для сложных типов..
Библиотека <vector> это конечно хорошо, но почему изменение длины массива не реализовано в стандартной библиотеке. А ведь C++ самый успешный и развивающийся язык программирования.
Учитывая тот факт что в С++ можно объявить массив где угодно в теле алгоритма, то преимущества динамического массива сужаются к двум:
1. можно создавать (суб)подмассивы произвольной длинны (в принципе существенный фактор);
2. тут же удалить массив из памяти после выполнения необходимых операций (не дожидаясь конца функции и т.п.).
А для Object Pascal преимущества динамического массива увеличиваются как минимум на два:
3. не занимает памяти, пока массив не востребован, т.е. не задана длинна (большой бонус, поскольку переменные объявляются только в разделе var и занимают память от начала алгоритма);
4. можно сколь угодно удлинять и укорачивать массив без потери данных в пределах усечения ( пример SetLength(Massiv, 1) ).
Резонные вопросы:
1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?
2. или забросили и недоделали данную операцию в С++ поскольку была библиотека <vector> (бред какой-то)? :eek:
Ответы на свои вопросы искал заранее, но нигде ничего не нашел. Может Вы, где что видели или знаете? Заранее благодарен. :rolleyes:
я Паскале я не силён... но подозреваю что скорее всего неявно производится выделение новой памяти(при расширении массива) и перенос массива туда.
вообще говоря, нельзя просто так нарастить длинну массива, потому что элементы любого массива располагаются в памяти последовательно, а гарантий того, что последующие ячейки памяти не будут заняты - нет.
C++ - это использование STL для работы с контейнерами.
операции new и delete растут из Си с malloc и free
в vector расширение памяти под хранимые объекты можно производить как явно, так и не явно, так что всё есть в C++
Спасибо за ответ. Тут надо поработать с литературой.
Ну тут вам уже ответили вроде
Учитывая тот факт что в С++ можно объявить массив где угодно в теле алгоритма, то преимущества динамического массива сужаются к двум:
Не понятно, как от преимущества объявить переменную где угодно может что-то сужаться?))
1. можно создавать (суб)подмассивы произвольной длинны (в принципе существенный фактор);
Так это возможно и в C и в C++ и в Pascal. и почему "суб" массивы?
2. тут же удалить массив из памяти после выполнения необходимых операций (не дожидаясь конца функции и т.п.).
Того же можно добиться и в паскале
3. не занимает памяти, пока массив не востребован, т.е. не задана длинна
vector тоже "не занимает памяти" пока не добавишь в него элементы
4. можно сколь угодно удлинять и укорачивать массив без потери данных в пределах усечения ( пример SetLength(Massiv, 1) ).
Также справедливо для vector
1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?
Совершенно верно
2. или забросили и недоделали данную операцию в С++ поскольку была библиотека <vector> (бред какой-то)? :eek:
"Библиотека" vector это и есть C++
Вы сначала разберитесь что сравнивать - стандартные массивы со статичским размером Pascal (array [..] of Integer) и C (int []), массивы со статическим размером и с динамическим выделением памяти в куче (зачастую называемые просто динамическими) в Pascal (GetMem(), New()) и в C (new int[]) или массивы с динамическим размером и (есс-но) с динамическим выделением памяти (также называемыми динамическими) array of в Pascal и vector в C++