Маалымат структураларын куруу: байланышкан тизмелер, стектер жана кезектер
Көрсөткүчтөр, акылдуу көрсөткүчтөр жана шаблондор менен бир байланышкан тизмени, стекти жана кезекти нөлдөн курабыз
std::vector, std::list, std::stack жана std::queue дегендерди мурунтан эле берет. Бирок аларды өзүң бир жолу курганда гана маалыматтын кантип сакталып, окулаарын жана ар бир контейнер эмне үчүн ушундай ылдамдыкка ээ экенин чын-чынына түшүнөсүң. Бул темада сиз үч классикалык структураны бир кирпичтен - түйүндөн - чогултуп, алардын ар бири кайсы жерде туура курал экенин көрөсүз.
std::unique_ptrменен байланышкан түйүндөрдөн бир байланышкан тизме куруу,- ошол тизменин үстүнөн стек (акыркы киргени - биринчи чыгат) жана кезек (биринчи киргени - биринчи чыгат) ишке ашыруу,
- ар бир структураны класс шаблону менен жалпыланган кылып, каалаган типти сактай тургандай кылуу,
- компромисстер жөнүндө ой жүгүртүп, тапшырма үчүн туура структураны тандоо.
Бул курстун мурунку темаларына таянат: Акылдуу көрсөткүчтөр, Функция жана класс шаблондору, Жылдыруу семантикасы жана Бештин эрежеси. Аларды көз алдыда кармоо милдеттүү эмес, бирок биз аларга таянабыз.
Түйүн: чынжырдын бир звеносу
Түйүн - бул бир маанини жана кийинки түйүнгө көрсөткүчтү сактаган кичинекей структура. Бүт тизме - бул жөн гана чогуу байланышкан түйүндөр; акыркы түйүн эч нерсеге көрсөтпөйт (nullptr), бул аягын билдирет.
C тилиндеги классикалык жол - жылаңач Node* көрсөткүчү. Заманбап C++те биз ар бир түйүнгө кийинкисине std::unique_ptr аркылуу ээ болуусуна уруксат беребиз. Ээлик өзгөчө - ар бир түйүн так өзүнүн артындагы куйрукка ээ - жана баш жок кылынганда, деструкторлор чынжыр боюнча ылдый иштеп, ар бир түйүндү автоматтык түрдө бошотот. Кол менен delete жок, агып кетүү жок.
#include <memory>
struct Node {
int value; // пайдалуу маалымат
std::unique_ptr<Node> next; // чынжырдын калганына ээ
Node(int v) : value(v), next(nullptr) {}
};
next - бул unique_ptr болгондуктан, түйүн жылдырылуучу гана: сиз чынжырды кокустан көчүрө албайсыз, жана ар бир звенонун так бир ээси бар. Дал ушул кепилдикти тизме каалайт.