Контейнер у комп'ютерній науці — клас, структура даних, або абстрактний тип даних, який дозволяє створювати колекції інших об'єктів. Іншими словами, контейнери застосовуються для зберігання об'єктів у вигляді організованої структури на основі конкретних правил збереження і доступу до елементів.
Застосування контейнерів
Навіщо варто використовувати контейнери, а не звичайні масиви:
- Контейнери дозволяють більш продуктивно створювати програмний код.
- Використання стандартних, добре перевірних класів контейнерів дозволяє програмісту створювати більш надійний код, і уникати типових помилок.
- Код стає більш зрозумілим для інших програмістів, ніж при роботі зі звичайними масивами.
Стандартні проблеми і помилки, які часто трапляються при використанні масивів:
- При використанні індексованих масивів у мовах програмування системного рівня, такий як С чи , не існує перевірки, якщо індекс виходить за рамки масиву. Це зауваження не стосується багатьох мов, які вважаються простішими і більш захищеними від помилок програміста, таких як Pascal, Java тощо. Такі помилки важко відстежувати, адже в момент коли це трапляється ви можете отримати непередбачувану поведінку програми. Слід відмітити, що в деяких контейнерах, таких як std::vector, немає перевірки виходу за межі масиву, в методах доступу до елементів вектора.
- У мовах, які не мають автоматичного прибирання сміття, використання масивів часто потребує виділення пам'яті з купи, і в таких випадках програмісту необхідно власноруч подбати про те, щоб пам'ять виділена під масив була в кінці звільнена (враховуючи наявність всіх виключних ситуацій). Коли ви використовуєте контейнери, управління пам'яттю для вас відбувається автоматично.
- Ви не можете вставити елемент в середину масиву, або навіть додати один в кінець масиву, якщо ви не використовуєте динамічне виділення пам'яті для масиву, і навіть тоді вам доведеться виділяти пам'ять під новий масив і копіювати його елементи.
- Контейнери дозволяють вам звертатися до них за допомогою посилання чи за значенням, але масиви не дають вам такої можливості: до них завжди слід звертатися за посиланням. Якщо ви хочете зімітувати звернення до масиву за значенням, вам необхідно власноруч написати код, який явно копіює елементи масиву у коді, в тому числі знищувати ці копії, коли вони вже не потрібні. Все це відбувається автоматично, якщо ви використовуєте класи контейнерів.
- Якщо ваша функція має не статичний локальний масив, ви не можете повертати його за допомогою ключового слова return, але таке можливо при використанні об'єктів контейнерів.
Різні контейнери мають різні переваги і недоліки, але для кожної конкретної задачі зазвичай один із них підходить краще — зрозуміліше, безпечніше, простіше в підтримці і часто навіть більш ефективний — ніж простий масив. Наприклад:
- краще використати std::map ніж писати власний код для таблиці пошуку.
- std::map також можна використати для розріджених масивів чи розріджених матриць.
- std::vector стандартний клас контейнеру, який дуже схожий на масив, але пропонує декілька додаткових можливостей, дозволяючи перевіряти межі масиву використовуючи метод at(), додавання і видалення елементів, автоматичне управління пам'яттю навіть у разі виникнення виключних ситуацій, можливість звертатися за значенням і за допомогою посилання.
- std::string також можна розглядати як клас контейнер, і він майже завжди набагато краще ніж масив символів.
Класи контейнерів не завжди підходять для всіх ситуацій, і іноді вам доведеться використовувати масиви. Зазвичай це трапляється рідко. В таких випадках можна створювати свій контейнер, в якому доведеться використовувати звичайний масив. Інтерфейсну частину контейнера слід створювати такою, щоб програміст, який користується цим класом не замислювався над тим, що відбувається з масивом всередині.
Типи контейнерів
Контейнери, що містять значення
Зберігають копії об'єктів. Якщо ми доступаємось до об'єкту, контейнер повертає його копію. Якщо об'єкт буде змінений після того, як він був доданий до контейнеру, це не призведе до зміни даних всередині контейнеру.
Контейнери, що містять посилання
Зберігає вказівники або посилання на об'єкт. Якщо ми доступаємось до об'єкту, то отримаємо посилання на нього. Якщо об'єкт буде змінений після внесення його до контейнеру, це також приведе до зміни даних в контейнері.
Примітки
- Paul E. Black (ed.), entry for data structure in Dictionary of Algorithms and Data Structures. US National Institute of Standards and Technology.15 December 2004. Accessed on Oct 04, 2011.
- Entry data structure in the Encyclopædia Britannica (2009) Online entry [ 2 травня 2015 у Wayback Machine.] Accessed on Oct 04, 2011.
- C++ FAQ [ 7 липня 2014 у Wayback Machine.] [34.1] Why should I use container classes rather than simple arrays?
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina Kontejner znachennya Kontejner u komp yuternij nauci klas struktura danih abo abstraktnij tip danih yakij dozvolyaye stvoryuvati kolekciyi inshih ob yektiv Inshimi slovami kontejneri zastosovuyutsya dlya zberigannya ob yektiv u viglyadi organizovanoyi strukturi na osnovi konkretnih pravil zberezhennya i dostupu do elementiv Zastosuvannya kontejnerivNavisho varto vikoristovuvati kontejneri a ne zvichajni masivi Kontejneri dozvolyayut bilsh produktivno stvoryuvati programnij kod Vikoristannya standartnih dobre perevirnih klasiv kontejneriv dozvolyaye programistu stvoryuvati bilsh nadijnij kod i unikati tipovih pomilok Kod staye bilsh zrozumilim dlya inshih programistiv nizh pri roboti zi zvichajnimi masivami Standartni problemi i pomilki yaki chasto traplyayutsya pri vikoristanni masiviv Pri vikoristanni indeksovanih masiviv u movah programuvannya sistemnogo rivnya takij yak S chi C ne isnuye perevirki yaksho indeks vihodit za ramki masivu Ce zauvazhennya ne stosuyetsya bagatoh mov yaki vvazhayutsya prostishimi i bilsh zahishenimi vid pomilok programista takih yak Pascal Java tosho Taki pomilki vazhko vidstezhuvati adzhe v moment koli ce traplyayetsya vi mozhete otrimati neperedbachuvanu povedinku programi Slid vidmititi sho v deyakih kontejnerah takih yak std vector nemaye perevirki vihodu za mezhi masivu v metodah dostupu do elementiv vektora U movah yaki ne mayut avtomatichnogo pribirannya smittya vikoristannya masiviv chasto potrebuye vidilennya pam yati z kupi i v takih vipadkah programistu neobhidno vlasnoruch podbati pro te shob pam yat vidilena pid masiv bula v kinci zvilnena vrahovuyuchi nayavnist vsih viklyuchnih situacij Koli vi vikoristovuyete kontejneri upravlinnya pam yattyu dlya vas vidbuvayetsya avtomatichno Vi ne mozhete vstaviti element v seredinu masivu abo navit dodati odin v kinec masivu yaksho vi ne vikoristovuyete dinamichne vidilennya pam yati dlya masivu i navit todi vam dovedetsya vidilyati pam yat pid novij masiv i kopiyuvati jogo elementi Kontejneri dozvolyayut vam zvertatisya do nih za dopomogoyu posilannya chi za znachennyam ale masivi ne dayut vam takoyi mozhlivosti do nih zavzhdi slid zvertatisya za posilannyam Yaksho vi hochete zimituvati zvernennya do masivu za znachennyam vam neobhidno vlasnoruch napisati kod yakij yavno kopiyuye elementi masivu u kodi v tomu chisli znishuvati ci kopiyi koli voni vzhe ne potribni Vse ce vidbuvayetsya avtomatichno yaksho vi vikoristovuyete klasi kontejneriv Yaksho vasha funkciya maye ne statichnij lokalnij masiv vi ne mozhete povertati jogo za dopomogoyu klyuchovogo slova return ale take mozhlivo pri vikoristanni ob yektiv kontejneriv Rizni kontejneri S mayut rizni perevagi i nedoliki ale dlya kozhnoyi konkretnoyi zadachi zazvichaj odin iz nih pidhodit krashe zrozumilishe bezpechnishe prostishe v pidtrimci i chasto navit bilsh efektivnij nizh prostij masiv Napriklad krashe vikoristati std map nizh pisati vlasnij kod dlya tablici poshuku std map takozh mozhna vikoristati dlya rozridzhenih masiviv chi rozridzhenih matric std vector standartnij klas kontejneru yakij duzhe shozhij na masiv ale proponuye dekilka dodatkovih mozhlivostej dozvolyayuchi pereviryati mezhi masivu vikoristovuyuchi metod at dodavannya i vidalennya elementiv avtomatichne upravlinnya pam yattyu navit u razi viniknennya viklyuchnih situacij mozhlivist zvertatisya za znachennyam i za dopomogoyu posilannya std string takozh mozhna rozglyadati yak klas kontejner i vin majzhe zavzhdi nabagato krashe nizh masiv simvoliv Klasi kontejneriv ne zavzhdi pidhodyat dlya vsih situacij i inodi vam dovedetsya vikoristovuvati masivi Zazvichaj ce traplyayetsya ridko V takih vipadkah mozhna stvoryuvati svij kontejner v yakomu dovedetsya vikoristovuvati zvichajnij masiv Interfejsnu chastinu kontejnera slid stvoryuvati takoyu shob programist yakij koristuyetsya cim klasom ne zamislyuvavsya nad tim sho vidbuvayetsya z masivom vseredini Tipi kontejnerivKontejneri sho mistyat znachennya Zberigayut kopiyi ob yektiv Yaksho mi dostupayemos do ob yektu kontejner povertaye jogo kopiyu Yaksho ob yekt bude zminenij pislya togo yak vin buv dodanij do kontejneru ce ne prizvede do zmini danih vseredini kontejneru Kontejneri sho mistyat posilannya Zberigaye vkazivniki abo posilannya na ob yekt Yaksho mi dostupayemos do ob yektu to otrimayemo posilannya na nogo Yaksho ob yekt bude zminenij pislya vnesennya jogo do kontejneru ce takozh privede do zmini danih v kontejneri PrimitkiPaul E Black ed entry for data structure in Dictionary of Algorithms and Data Structures US National Institute of Standards and Technology 15 December 2004 Accessed on Oct 04 2011 Entry data structure in the Encyclopaedia Britannica 2009 Online entry 2 travnya 2015 u Wayback Machine Accessed on Oct 04 2011 C FAQ 7 lipnya 2014 u Wayback Machine 34 1 Why should I use container classes rather than simple arrays