Worden vectoren doorgegeven aan functies op waarde of op referentie in C++

Ik codeer in C++. Als ik een functie void foo(vector<int> test)heb en deze in mijn programma aanroep, wordt de vector dan doorgegeven door waarde of referentie? Ik weet het niet zeker omdat ik weet dat vectoren en arrays vergelijkbaar zijn en dat een functie als void bar(int test[])de test zou doorstaan op basis van referentie (aanwijzer?) in plaats van op waarde. Ik vermoed dat ik de vector expliciet per aanwijzer/referentie zou moeten doorgeven als ik het doorgeven van waarde wilde vermijden, maar ik weet het niet zeker.


Antwoord 1, autoriteit 100%

In C++ worden dingen op waarde doorgegeven, tenzij u anders specificeert met behulp van de &-operator (merk op dat deze operator ook wordt gebruikt als de ‘address-of’-operator, maar in een andere context ). Dit is allemaal goed gedocumenteerd, maar ik herhaal het toch:

void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo)
void foo(vector<int> const &bar); // by const-reference

Je kunt er ook voor kiezen om een aanwijzer door te geven aan een vector (void foo(vector<int> *bar)), maar tenzij je weet wat je doet en je voelt dat dit echt is de juiste keuze, doe dit niet.

Ook zijn vectoren niet hetzelfde als arrays! Intern, houdt de vector een reeks bij waarvan het het geheugenbeheer voor u behandelt, maar dus veel andere STL-containers. Je kunt een vector niet doorgeven aan een functie die een aanwijzer of array of vice versa verwacht (je kunt de toegang krijgen tot (aanwijzer naar) de onderliggende array en dit echter gebruiken). Vectoren zijn klassen die veel functionaliteit bieden via zijn lidfuncties, terwijl aanwijzingen en arrays zijn ingebouwde typen. Ook worden vectoren dynamisch toegewezen (wat betekent dat de grootte kan worden bepaald en is gewijzigd en gewijzigd), terwijl de C-Style-arrays statisch worden toegewezen (de grootte is constant en moet worden bekend bij het maken van het gebruik.

Ik stel voor dat je wat meer leest over C++ in het algemeen (specifiek array verval ), en Bekijk dan het volgende programma dat het verschil tussen arrays en pointers illustreert:

void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }
int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    foo1(arr);
    foo2(arr);
    foo3(arr);
    foo4(arr);
}

Antwoord 2, Autoriteit 17%

Een vectoris functioneel hetzelfde als een array. Maar voor de taal is vectoreen type, en intis ook een type. Voor een functieargument wordt een array van elk type (inclusief vector[]) behandeld als aanwijzer. Een vector<int>is niet hetzelfde als int[](voor de compiler). vector<int>is non-array, non-reference en non-pointer – het wordt doorgegeven door waarde, en daarom zal het copy-constructor aanroepen.

Dus je moet vector<int>&gebruiken (bij voorkeur met const, als de functie het niet aanpast) om het als referentie door te geven.


Antwoord 3, autoriteit 7%

void foo(vector<int> test)

vector zou hierin door waarde worden doorgegeven.

Je hebt meer manieren om vectoren door te geven, afhankelijk van de context:-

1) Pass by reference:- Hiermee kan de functie foo uw inhoud van de vector wijzigen. Efficiënter dan waarde doorgeven omdat het kopiëren van vectoren wordt vermeden.

2) Pass by const-referentie:- Dit is zowel efficiënt als betrouwbaar als u niet wilt dat een functie de inhoud van de vector verandert.


Antwoord 4

wanneer we vector door waarde in een functie als argument doorgeven, wordt eenvoudigweg de kopie van vector gemaakt en gebeurt er geen effect op de vector die is gedefinieerd in de hoofdfunctie wanneer we die specifieke functie aanroepen.
terwijl wanneer we vector door verwijzing doorgeven wat er ook in die specifieke functie is geschreven,
elke actie zal worden uitgevoerd op de vector die is gedefinieerd in de hoofdfunctie of een andere functie wanneer we die specifieke functie aanroepen.

Other episodes