WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Динамическое изменеие размера массива

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Динамическое изменеие размера массива
Serus опубликован 20-01-2002 22:26 MSK   Click Here to See the Profile for Serus  
Существует некий класс CMyClass
далее создается массив объектов:
CMyClass MyCl[100];

Далее нужно "нарастить" MyCl, например, до 200 элемеентов. При этом содержимое первых 100 должно сохраниться.

Как это cделать?
Заранее спасибо!

DenizK опубликован 20-01-2002 22:47 MSK     Click Here to See the Profile for DenizK  Click Here to Email DenizK     
можно например использовать STLевский vector или что-нибудь похожее...
ADK опубликован 21-01-2002 06:36 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Что-то вы все тут к STL неравнодушны. В MFC есть шаблоны, которые помогут в 90% случаев. Юзай CArray<>
DenizK опубликован 21-01-2002 08:37 MSK     Click Here to See the Profile for DenizK  Click Here to Email DenizK     
Можно и CArray (имхо он и работает чуть быстрее), но при юзанье STL можно пользовать ихние алгоритмы + легче портировать код. Лично я не вижу принципиальных преимуществ CArray перед stl::vector и имхо выбор контейнера - дело вкуса :-)
ADK опубликован 21-01-2002 10:50 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
При юзаньи динамической компоновки с MFC код классов типа CStringArray, CByteArray и т.д. железно остаётся в MFC42.DLL, и экономит размер EXE, про шаблоны не знаю... Хотя экономится по нынешним меркам не так уж много, мне приятно...
DenizK опубликован 21-01-2002 13:28 MSK     Click Here to See the Profile for DenizK  Click Here to Email DenizK     
>> железно остаётся в MFC42.DLL....
, который приходится таскать за собой или статически прилинковывать к программе:-( Если прога - маленькая консольная утилита, то имхо это не лучшее решение. Да и итераторы в STL мне тоже ндравятся:-) А шаблоны резмер проги увеличат несильно.
ADK опубликован 21-01-2002 13:40 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Да нифига я её не такаю, только у чукчей её сейчас нет. кому надо, загрузят с web. (1% юзеров)
ADK опубликован 21-01-2002 13:44 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Про разные версии MFC42.DLL тоже знаю.
DenizK опубликован 21-01-2002 14:06 MSK     Click Here to See the Profile for DenizK  Click Here to Email DenizK     
Чтоб не быть голословным по поводу итераторов: const_iterator и reverse_iterator - мелочь, а приятно:-) В MFCшной реализации нет такой гибкости.
Vovochka опубликован 21-01-2002 15:00 MSK     Click Here to See the Profile for Vovochka  Click Here to Email Vovochka     
Надо либо написать ручками, что-то типа:

if(nMyClass>100) for(int i=0; i<100; i++) tmp[i]=MyClas[i];
delete []MyClass; MyClass=0;
MyClass=new MyClass[200];
for(int i=0; i<100; i++) MyClas[i]=tmp[i];

Либо использвать косвенные контейнерные классы. Про мелкософтовские ничего не скажу (ну не люблю я дядю Билла...), но у Борландовских косвенных контейнеров есть одно важное свойство: время выборки объекта из контейнера любой длины есть величина постоянная.

Student опубликован 21-01-2002 18:17 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
Короче, делаем так:

#define DEFAULT_SIZE 128
#define DEFAULT_INC 64

int nAllocatedSize = DEFAULT_SIZE;
CMyClass **lpTable; // указатель на таблицу указателей на класс CMyClass

// надо проверить насчет звездочек, но идея, думаю, понятна...
...
int Resize(CMyClass **lpBank, const int nNewSize)
{
if (nNewSize <= nAllocatedSize) return 0;
CMyClass **lpTmp = new CMyClass *[nNewSize]
if (!lpTmp) return 0;
for (int i=0; i<nAllocatedSize; i++)
lpTmp[i] = lpBank[i];
delete []lpBank;
lpBank = lpTmp;
nAllocatedSize += nNewSize;
return 1; // OK
}

int main() {
lpTable = new CMyClass *[DEFAULT_SIZE];
...
Resize(&lpTable, 500); // новый размер 500 шт.
...
}

eyes опубликован 21-01-2002 18:18 MSK     Click Here to See the Profile for eyes  Click Here to Email eyes     
>Про мелкософтовские ничего не скажу (ну не люблю я дядю Билла...),
>но у Борландовских косвенных контейнеров есть одно важное свойство:
>время выборки объекта из контейнера любой длины есть величина постоянная.

CArray<TYPE, ARG_TYPE>::GetAt(i) думаешь отличается для i=0 и i=100000 ?
{а я Windows люблю... и M$ тоже:}

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.