Автор
|
Тема: Динамическое изменеие размера массива
|
Serus |
опубликован 20-01-2002 22:26 MSK
Существует некий класс CMyClass далее создается массив объектов: CMyClass MyCl[100];Далее нужно "нарастить" MyCl, например, до 200 элемеентов. При этом содержимое первых 100 должно сохраниться. Как это cделать? Заранее спасибо!
|
DenizK
|
опубликован 20-01-2002 22:47 MSK
можно например использовать STLевский vector или что-нибудь похожее... |
ADK
|
опубликован 21-01-2002 06:36 MSK
Что-то вы все тут к STL неравнодушны. В MFC есть шаблоны, которые помогут в 90% случаев. Юзай CArray<> |
DenizK
|
опубликован 21-01-2002 08:37 MSK
Можно и CArray (имхо он и работает чуть быстрее), но при юзанье STL можно пользовать ихние алгоритмы + легче портировать код. Лично я не вижу принципиальных преимуществ CArray перед stl::vector и имхо выбор контейнера - дело вкуса :-) |
ADK
|
опубликован 21-01-2002 10:50 MSK
При юзаньи динамической компоновки с MFC код классов типа CStringArray, CByteArray и т.д. железно остаётся в MFC42.DLL, и экономит размер EXE, про шаблоны не знаю... Хотя экономится по нынешним меркам не так уж много, мне приятно... |
DenizK
|
опубликован 21-01-2002 13:28 MSK
>> железно остаётся в MFC42.DLL.... , который приходится таскать за собой или статически прилинковывать к программе:-( Если прога - маленькая консольная утилита, то имхо это не лучшее решение. Да и итераторы в STL мне тоже ндравятся:-) А шаблоны резмер проги увеличат несильно. |
ADK
|
опубликован 21-01-2002 13:40 MSK
Да нифига я её не такаю, только у чукчей её сейчас нет. кому надо, загрузят с web. (1% юзеров) |
ADK
|
опубликован 21-01-2002 13:44 MSK
Про разные версии MFC42.DLL тоже знаю. |
DenizK
|
опубликован 21-01-2002 14:06 MSK
Чтоб не быть голословным по поводу итераторов: const_iterator и reverse_iterator - мелочь, а приятно:-) В MFCшной реализации нет такой гибкости. |
Vovochka
|
опубликован 21-01-2002 15:00 MSK
Надо либо написать ручками, что-то типа: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
Короче, делаем так:#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
>Про мелкософтовские ничего не скажу (ну не люблю я дядю Билла...), >но у Борландовских косвенных контейнеров есть одно важное свойство: >время выборки объекта из контейнера любой длины есть величина постоянная.CArray<TYPE, ARG_TYPE>::GetAt(i) думаешь отличается для i=0 и i=100000 ? {а я Windows люблю... и M$ тоже:} |