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ů: 4Bez & 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.
Jak psát:
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
3/10