Loading...
RaUndreundre avatar RaUndreundre 54 Точки

Промяна на размера на dynamic array

Поставих си за цел да чета от конзолата неизвестен брой редове (до ключова дума) и да ги пълня в dynamic array.

Примерен вход:

Ala bala

edno

dve

END

Това за което се сещам е да променям размера на масива на всяка итерация. Макар и грубо това би трябвало да работи.

Въпросите ми са:

1. Кой е правилният начин да променим размера на dynamic array?

2. Кой е добрият начин да реша горния проблем, ползвайки само dynamic array?

 

Тагове:
0
C++ Advanced
MartinBG avatar MartinBG 4803 Точки
Best Answer

Размерът на масива е фиксиран и не може да бъде променян. Това, което може да се прави е да се инициализира нов масив, като данните от старият се копират, преди да освободим паметта му. Това е възможно най-лошият начин за решаването на подобен тип проблеми, защото заделянето и освобождаването на динамична памет са изключително бавни операции.

Смислено решение само с използването само на динамичен масив е да заделяме памет за повече елементи преди всяко преалокиране и да пазим в променливи индекса на последния/следващия елемент и макс. брой елементи за заделената памет. Преди да добавим нов елемент в масива проверяваме дали не сме достигнали лимита му и ако е така, създаваме нов масив с примерно 20% по-голям размер, копираме данните от стария, освобождаваме му паметта и добавяме новия елемент в края. По подобен начин е имплементиран std::vector.

2
RaUndreundre avatar RaUndreundre 54 Точки

Благодаря! Следвайки препоръките ви, написах тази функция. Ако има недостатъци, ще се радвам да ги споделите.

void readInput(std::string*& arr, int& arrSize, int& elemCount) {
    std::string line;
    int tmp = 0;
    while(getline(std::cin, line) && line != "END") {
        elemCount++;
        if(elemCount > arrSize) {
            tmp = std::ceil(arrSize * 1.2);
            std::string* newArr = new std::string[tmp];
            for(int i = 0; i < arrSize; ++i) {
                newArr[i] = arr[i];
            }
            arrSize = tmp;
            delete[] arr;
            arr = newArr;
        }
        arr[elemCount -1] = line;
    }
}

int main() {
    int arrSize = 10;
    int elemCount = 0;
    std::string* arr = new std::string[arrSize];
    readInput(arr, arrSize, elemCount);

    delete[] arr;
    return 0;
}

 

2
08/05/2023 14:26:34
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.