Cum ar trebui sa declar un ciur in c++, daca numerele sunt foarte mari ? (ERATOSTENE)
Răspunsuri la întrebare
►De ce nu pot declara simplu un ciur de dimensiune enorma ?
Toate variabilele declarate in functii (inclusiv functia main) sunt salvate pe stiva in mod default. Toate compilatoarele au o limita la dimensiunea maxima a stivei. In Visual Studio limita este de 1MB (poti stoca un vector cu cu aproximativ 250000 de valori de tip int pana sa depasesti limita). In Code::Blocks limita e ceva mai maricica. Din acest motiv nu poti declara vectori de dimeniuni foarte mari in functii.
► Avem urmatoarele optiuni :
◘ Declaram ciurul ca variabila globala in afara functiei main (NERECOMANDAT)
exemplu :
◘ Declaram ciurul in functia main dinamic - recomandat. Asa putem aloca doar dimeniunea care ne intereseaza. Pentru alocare dinamica pe heap putem folosi in C++ operatorul new[]. Nu uitam sa dealocam la final memoria alocata folosind operatorul delete[],
exemplu :
int main() {
int n;
cin >> n;
unsigned* ciur = new unsigned[n]; //Aloca dinamic memorie pentru n valori de tip unsigned
//....
delete[] ciur; //Elibereaza memoria alocata dinamic
}
◘ Folosim vectori/array din STL. In C++ avem diverse containere. Printre acestea se enumera vectori, array, map, set si alte structuri de date. Pentru folosirea vectorului din STL e necesar sa includem biblioteca <vector>. Citeste documentatia pentru mai multe informatii. Pentru problema cu ciurul e posibil sa ne avantajeze set mai mult decat un vector.
exemplu :
int main() {
int n;
cin >> n;
vector<unsigned> ciur; //Declara vector care retine elemente de tip vector
ciur.resize(n); //Redimensioneaza dimensiunea vectorului pentru n elemente
}