Změna vektoru ve funkci

V lekci o funkcích jste viděli, že funkce dostane kopii vektoru. Když kopii změní, vektor toho, kdo funkci zavolal, zůstane stejný. Teď už víte, jak to změnit: parametr bude reference na vektor, std::vector<int>&.

#include <iostream>
#include <vector>

void pridejHod(std::vector<int>& hody, int hod) {
    hody.push_back(hod);
}

int main() {
    std::vector<int> hody = {4, 2};
    pridejHod(hody, 6);
    pridejHod(hody, 1);
    std::cout << "Počet hodů: " << hody.size() << std::endl;
    return 0;
}

Tento kód vypíše:

Počet hodů: 4

Bez & by funkce přidávala hody do své kopie a program by vypsal Počet hodů: 2.

Přes referenci můžete měnit i prvky vektoru. Tato funkce zdvojnásobí všechna čísla ve vektoru:

void zdvojnasobVse(std::vector<int>& cisla) {
    for (int i = 0; i < cisla.size(); i++) {
        cisla[i] = cisla[i] * 2;
    }
}

Pozor na cyklus for přes prvky vektoru. Tato verze vektor nezmění, i když je parametr reference:

void zdvojnasobVse(std::vector<int>& cisla) {
    for (int cislo : cisla) {
        cislo = cislo * 2;
    }
}

Proměnná cislo je v každém průchodu cyklem kopie jednoho prvku, stejně jako parametr předaný hodnotou. Cyklus zdvojnásobí kopie a vektor zůstane, jak byl. Program se přitom přeloží i spustí bez chyby. Když chcete prvky v takovém cyklu měnit, přidejte & i sem:

void zdvojnasobVse(std::vector<int>& cisla) {
    for (int& cislo : cisla) {
        cislo = cislo * 2;
    }
}

Teď je cislo v každém průchodu reference na jeden prvek vektoru a co uděláte s cislo, stane se s prvkem. Stejně dobře funguje cyklus s indexem z prvního příkladu.

Pokyny

Funkce pridejBonus má každému hráči přičíst bonusové body, ale program vypíše původní body 12, 7 a 15. Funkce má dvě chyby. Nejdřív opravte parametr: funkce musí dostat referenci na vektor, ne jeho kopii. Program pak bude vypisovat pořád stejná čísla. Proč?

Opravte i cyklus ve funkci, aby měnil prvky vektoru, a ne jejich kopie. Program pak vypíše body s bonusem pod sebou: 17, 12 a 20.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

3/10