Контейнер класын қолдана білу — деректер құрылымын түсіну деген сөз емес. append-ті бәрі шақыра алады, бірақ ол қашан бір-ақ қадам, ал қашан бүкіл массивті көшіріп тынады — жауабы API құжатында емес, жадта жатыр. Бұл серияда әр мақала бір құрылымды алып, капоттың астына дейін ашады: операция тізімін жаттамаймыз, ұяшықтар мен көрсеткіштерді сызып шығамыз — әр құнның қайдан шыққанын көзбен көрсетеміз.

Үш өзекті сұрақ.

Мұнда әр құрылым бірдей тергеуден өтеді — он бес мақалаға ортақ үш сұрақ:

Дерек қайда
Ол жадтың қай ұяшықтарын алып жатыр: қатар тізілген бір қатар ма, әлде көрсеткіштер арқылы бірін-бірі табатын шашыраңқы ұяшықтар ма? Осы бір таңдау кездейсоқ қатынауды, cache сәттілігін және көшіру құнын шешеді.
Көрсеткіш кімге нұсқайды
Әр көрсеткіш ұяшығында кімнің мекенжайы жатыр? Қосу, өшіру, өзгерту дегеніңіз түбінде бірнеше көрсеткішті қайта жазу — ал ретін шатастырсаңыз, тізбек жарты жолда үзіледі.
Құн қайда жұмсалады
Әр операция ұяшықтардың үстінен неше қадам жүреді? Қадам саны көлеммен бірге қалай өседі? Жауап саналады, жатталмайды — керек жерінде өлшеумен түйінделеді.

Бір белгілеу жүйесі.

Осы үш сұраққа жауап беру үшін бүкіл серияға ортақ бір белгілеу жүйесі қызмет етеді. Бұл әшекей емес: суреттегі әр нүкте, әр бағыттауыш — жадта шын бар нәрсенің бейнесі:

系列图例:左边是记录体记法——head 变量盒指向两格节点,焦点指针为橙色;右边是迷你内存表——格子的编号灰色,格子里存的地址绿色 DATA STRUCTURES · 图例 一套记法,贯穿全系列. head 11 23 Val Next 0xC000 0xC010 地址 变量 数据 0x9000 head 0xC000 0xC000 Val 11 0xC008 Next 0xC010 绿 = 地址与指针,橙 = 当页唯一焦点,墨 = 值,灰 = 结构。两种记法,同一份内存。
  • Жад кестесі: мекенжай бір баған, айнымалы бір баған, дерек бір баған. Ұяшықтың өз нөмірі сұр, ұяшықтың ішінде жатқан нөмір жасыл — көрсеткіште ешқандай сиқыр жоқ, мекенжай да дерек.
  • Жазба денесі: құрылым (struct) жадтағы қалпында сызылады. Бір ұяшық — Val мәні, бір ұяшық — Next көрсеткіші, ана жасыл нүкте — көрсеткіштің тап өзі; соңында nil сызығы; head, cur дегендер — мекенжай салынған айнымалы қораптар.
  • Қадамдық көрініс: процесс баяндаумен емес, қозғалыспен көрсетіледі. Түйіндер кадрдан кадрға өз басын сақтайды, тізбек өзгерсе жаңа орнына жылжып барады — ырғақ өз қолыңызда: ← → пернелерімен қадамдаңыз, не өзі жүріп шықсын:
0xC000110xC01023headValNext

Жазба денесі көріністе тірілді: бір ұяшық — мән, бір ұяшық — көрсеткіш, head — ішінде 0xC000 жатқан айнымалы қорап.

  1. Жазба денесі көріністе тірілді: бір ұяшық — мән, бір ұяшық — көрсеткіш, head — ішінде 0xC000 жатқан айнымалы қорап.
  2. Қызғылт сары түс әрқашан тек осы кадрдың жалғыз фокусына беріледі — бұл кадрда 11-дің Next ұяшығындағы 0xC010-ды бақылаңыз.
  3. Құрылым өзгерді — түйіндер қозғалады: 23 тізбектен шығып түбіне түсті, 11 енді соңғы түйін, оның Next ұяшығына nil сызығы қойылды.
Әр кадр бір-ақ нәрсе айтады. Кері қайтуға, автоойнатуға болады — баспа нұсқасы мен ЖИ оқырман кадрлардың толық тізімін алады.
  • Go коды: мысалдардың тілі — Go, себебі біреу-ақ: көрсеткіштер айқын жазылады. *Node мен nil — суреттегінің дәл өзі, сурет пен код арасында аударма шығыны жоқ. Бұл Go оқулығы емес: C әулетінің кез келген тілін оқи алсаңыз, мұндағы кодты да оқисыз. Тағы бір кілт сөйлемді осында қалдырамын, көрсеткіштер мақаласы сонымен құлып ашады: Go-да меншіктеу мен параметр берудің бір-ақ түрі бар — ұяшықтағы дерек көшіріледі; көшірілгені мән бе, мекенжай ма — нені өзгерте алатыныңыз соған байланысты.
type Node struct {
    Val  int
    Next *Node
}

Қалай оқу керек.

Он бес мақала тәуелділік ретімен тізілген, бірі-біріне алдын ала белгі тастап отырады: Іргетас (күрделілік, көрсеткіштер) → Сызықтық (массив пен кесінді, байланысқан тізім, қос бағытты тізім, стек пен кезек) → Рекурсия мен ағаштар (рекурсия, ағаш пен BST, аралау, теңгерімді ағаштар, үйме) → Хеш пен граф (хеш-кесте, граф) → Түйін (сұрыптау — бүкіл серия бір мәселенің басында тоғысады). Ретімен оқыған тиімдірек; жеке мақала да өз алдына оқылады — алдыңғы қорытындыға сүйенген жер артқа сілтеме беріп отырады.

Серияның қазақша нұсқасы бірте-бірте жарияланады: мақалалар шыққан сайын жол картасындағы атаулар басылатын сілтемеге айналады.

Әр мақаланың ырғағы бірдей: алдымен құрылым сызылады, сосын операциялар көріністе қозғалады, соңында код түседі — төрелік керек жерде сөз өлшеуге беріледі. Суреттерді үлкейтуге, көріністі қадамдауға болады; баспа мен ЖИ-оқырман нұсқасы бір стоп-кадр емес, кадрлардың толық тізімін алады.

Капот ашылды — келесі мақала «қадам санаудан» басталады.