Exemplu clasă de containere

Această secțiune se găsește în documentația Visual C ++ ca exemplu nefolositor al containerelor utilizate în biblioteca standard C ++. Pentru mai multe informații, consultați containerele STL.







Descrie un obiect care controlează secvența de elemente, de obicei de tipul Ty. Secvența este stocată diferit în funcție de containerul real.

Poate fi un constructor de containere sau o funcție de membru, sunați constructorul în cazuri rare Ty (const Ty ) sau Ty :: operator = (const Ty ). Dacă un astfel de apel ridică o excepție, obiectul containerului este obligat să păstreze integritatea și să recreeze orice excepție pe care o interceptează. Puteți să înlocuiți în siguranță, să atribuiți, să ștergeți sau să distrugeți obiectul containerului, după ce creează una dintre aceste excepții. În general, cu toate acestea, este imposibil altfel să se prevadă starea secvenței controlate de obiectul containerului.

Câteva avertismente suplimentare:

Tu a creat o excepție, starea rezultată a obiectului container este nedefinită.

Dacă containerul care stochează obiectul de distribuție este al. și al solicită o excepție diferită de apelul al.alocate. starea rezultantă a obiectului containerului este nedefinită.

Dacă containerul stochează funcția comp. Pentru a determina ordonarea secvenței gestionate și comp produce orice tip de excepție, starea rezultată a obiectului container este nedefinită.

Clasele de containere definite de STL îndeplinesc mai multe cerințe suplimentare, după cum se descrie în următoarele paragrafe.

Clasa de șablon pentru lista de contacte oferă un comportament determinist și util, chiar și cu excepțiile descrise mai sus. De exemplu, dacă se produce o excepție în timpul inserării unuia sau mai multor elemente de container, iar excepția este creată din nou.







Pentru toate clasele de containere definite de STL, dacă excepția este atunci când apelați următoarele funcții ale membrilor:

Funcția membru șterge excepția numai dacă operația de copiere (alocare sau construire de copie) aruncă o excepție.

În plus, nu se produce o excepție atunci când se copiază un iterator returnat de o funcție membru.

Funcția de înlocuire a membrilor oferă avantaje suplimentare pentru toate clasele de containere STL definite:

Funcția unui membru numai dacă containerul stochează un obiect de distribuție al, o excepție este aruncată și al solicită o excepție la copiere.

Referințele, indicii și iteratorii care indică elementele unei secvențe gestionate prin comutarea lor sunt încă valide.

Obiectul de clasă container definit de STL alocă și eliberează spațiul de stocare pentru secvență, gestionează printr-un obiect stocat de tip Alloc. care este de obicei un parametru șablon. Un astfel de obiect al distribuitorului trebuie să aibă aceeași interfață externă ca și obiectul de clasă al alocatorului . În special, Alloc trebuie să fie de același tip ca Alloc :: rebind . alte

Pentru toate clasele de containere, se definește STL, funcția membru get_allocator Alloc const; returnează o copie a obiectului de distribuție salvat. Rețineți că obiectul de distribuție salvat nu este copiat atunci când este atribuit obiect container. Toți constructorii inițializează valoarea stocată în alocator. in Alloc Dacă constructorul conține un parametru non-alocator.

Conform standardului C ++, clasa containerului definită de STL poate fi considerată a fi:

Toate obiectele din clasa Alloc compară egalitatea.

Tipul Alloc :: const_pointer este același cu const Ty *.

Tip Alloc :: const_reference este același cu const Ty .

Totuși, în această implementare, containerele nu fac astfel de ipoteze simplificatoare. Astfel, ele funcționează corect cu obiectele alocate, care sunt mai semnificative:

Toate obiectele din clasa Alloc nu trebuie să fie comparate egale. (Puteți să acceptați mai multe grupuri media).

Tipul Alloc :: const_pointer nu trebuie să fie același cu tipul const *. (Un pointer constant poate fi o clasă.)

Tipul Alloc :: pointer nu trebuie să fie același ca Ty *. (Pointerul poate fi o clasă.)







Articole similare

Trimiteți-le prietenilor: