Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Увеличение динамического массива в С++

9.4K
01 ноября 2007 года
1_Aposym_1
68 / / 01.11.2007
Возникла проблемка которая не дает мне спокойствия. Суть такова, есть указатель на целое int *a;Затем выделяем память, а=new int[10]; потом, заполнили его в цикле числами. И тут мне надо еще добавить ячеек в массив а, что бы туда записать числа, можно конечно через временный массив но мне не хотеться. Когда так делаю а=new int[20]; то вся информация что была раньше исчезает. Как увеличить массив без потери данных? Заранее спасибо!
Пример

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;
320
01 ноября 2007 года
m_Valery
1.0K / / 08.01.2007
Используй вектор.
Код:
#include <iostream>
#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;
}
9.4K
02 ноября 2007 года
1_Aposym_1
68 / / 01.11.2007
m_Valery cпасибо что откликнулся и сразу же вопрос. В vector &#8211;е можно использовать структуры(vector<struct >), просто я привел простейший пример, а мне надо массив структур увеличивать. Как с этим быть?
489
02 ноября 2007 года
NeO_u
277 / / 11.10.2006
естественно можно:-)
 
Код:
struct sHosts
    {
        string hostname;
        string nserver;
        string devid;
        string fixaddr;
    };
  vector<sHosts>hosts;
240
02 ноября 2007 года
aks
2.5K / / 14.07.2006
Можно исспользовать любой тип. Главное чтобы для него были определенны оператор присваивания и конструктор копирования.

Ну или можно исспользовать указатель на тип (который сам по себе тип но у него есть оператор присваивания). ))
309
02 ноября 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Когда так делаю а=new int[20]; то вся информация что была раньше исчезает.


Информация не исчезает, а просто становится недоступной, потому что выделяется новый блок, но в программе отсутствует указатель на старый блок - утечка памяти.
Для простых типов данных можно использовать функцию realloc

 
Код:
// выделяем блок памяти под 10 элементов размером с int (4*10 байт)
int *array = (int*) malloc (10 * sizeof (int));
// изменяем размер блока выделенной памяти
array = (int*) realloc (array, 20 * sizeof (int));
// освобождаем память
free (array)

При увеличении блока, функция может выполнить перемещение данных в бо'льшую область памяти.
Данные функции не обнуляют выделенную память и не вызывают ни конструкторы, ни деструкторы (в отличие от new[] и delete[]) - поэтому их очень сложно использовать для сложных типов..
9.4K
03 ноября 2007 года
1_Aposym_1
68 / / 01.11.2007
Всем спасибо помогли хорошенько
63K
27 августа 2010 года
Juni
2 / / 27.08.2010
Я постоянно работаю с динамическими массивами в 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:
2.1K
27 августа 2010 года
Norgat
452 / / 12.08.2009
шаблонный класс vector находится в STL, что расшифровывается как Standart Template Libraty(стандартная библиотека шаблонов).

Цитата:
1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?



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

Цитата:
2. или забросили и недоделали данную операцию в С++ поскольку была библиотека <vector> (бред какой-то)?



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

в vector расширение памяти под хранимые объекты можно производить как явно, так и не явно, так что всё есть в C++

63K
28 августа 2010 года
Juni
2 / / 27.08.2010
Цитата: Norgat
вообще говоря, нельзя просто так нарастить длинну массива, потому что элементы любого массива располагаются в памяти последовательно, а гарантий того, что последующие ячейки памяти не будут заняты - нет.



Спасибо за ответ. Тут надо поработать с литературой.

14
31 августа 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: Juni
Библиотека <vector> это конечно хорошо, но почему изменение длины массива не реализовано в стандартной библиотеке. А ведь C++ самый успешный и развивающийся язык программирования.


Ну тут вам уже ответили вроде

Цитата: Juni

Учитывая тот факт что в С++ можно объявить массив где угодно в теле алгоритма, то преимущества динамического массива сужаются к двум:


Не понятно, как от преимущества объявить переменную где угодно может что-то сужаться?))

Цитата: Juni

1. можно создавать (суб)подмассивы произвольной длинны (в принципе существенный фактор);


Так это возможно и в C и в C++ и в Pascal. и почему "суб" массивы?

Цитата: Juni

2. тут же удалить массив из памяти после выполнения необходимых операций (не дожидаясь конца функции и т.п.).


Того же можно добиться и в паскале

Цитата: Juni

3. не занимает памяти, пока массив не востребован, т.е. не задана длинна


vector тоже "не занимает памяти" пока не добавишь в него элементы

Цитата: Juni

4. можно сколь угодно удлинять и укорачивать массив без потери данных в пределах усечения ( пример SetLength(Massiv, 1) ).


Также справедливо для vector

Цитата: Juni

1. может Object Pascal хитрит, т.е. метод SetLength создает второй массив новой длины и копирует данные с первого и переписывает указатель?


Совершенно верно

Цитата: Juni

2. или забросили и недоделали данную операцию в С++ поскольку была библиотека <vector> (бред какой-то)? :eek:


"Библиотека" vector это и есть C++

Вы сначала разберитесь что сравнивать - стандартные массивы со статичским размером Pascal (array [..] of Integer) и C (int []), массивы со статическим размером и с динамическим выделением памяти в куче (зачастую называемые просто динамическими) в Pascal (GetMem(), New()) и в C (new int[]) или массивы с динамическим размером и (есс-но) с динамическим выделением памяти (также называемыми динамическими) array of в Pascal и vector в C++

518
31 августа 2010 года
Andreika
101 / / 14.02.2003
Попробуйте нарыть в интернете и разобраться с какой-нибудь простейшей программкой перебора двумерного массива на ассемблере. Тогда сразу будет понятно, как оно все есть на самом деле, и что паскаль не может не "хитрить" когда меняет размерность массивов. На деле все N-измерений массива в памяти располагаются плоско, одно значение за другим. Поэтому без ухищрений (класса vector, в частности) получить динамически изменяемый массив нельзя вообще. Независимо от языка программирования.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог