Ad argvmentvm transi
Topos Uranos

Svmmarivm

Hactenvs qvaeqve collectio cvrsvs data vnivs generis tantvm continebat: aestimationes, statvras, cellas tabvlae. Entia vero problematis plvres proprietates diversorvm genervm habent: discipvlvs nomen et aestimationem habet; liber titvlvm, avctorem, annvm. Haec lectio tabvlarivm proponit, genvs compositvm qvod ipse programmator per struct definit vt eas proprietates svb vno nomine congreget. Incipit a cavsa propter qvam tabvlaria svnt, id est a fragilitate vectorvm parallelorvm; pergit ad definitionem ipsivs struct, ad eivs campos cvm valore initiali et ad tabvlaria creanda vncis cvrvis et initialisatoribvs designatis; deinde tabvlaria vt parametra et vt resvltata fvnctionvm tractat, et vectores tabvlariorvm, qvi ligatvris strvctvratis percvrrvntvr et secvndvm campvm ordinantvr et pervestigantvr, vna cvm qvaestione ordinationis stabilis; et finit in arte problematis generibvs effingendi qvae eivs regionem referant.

Proposita discendi

  1. Definire struct cvm campis et valoribvs initialibvs, et tabvlaria creare initialisatione vncis cvrvis, etiam cvm initialisatoribvs designatis.
  2. Fvnctiones scribere qvae tabvlaria accipiant et reddant, modvm transmissionis eligendo.
  3. Vectorem tabvlariorvm secvndvm campvm ordinare et in eo qvaerere per std::ranges::sort, std::ranges::stable_sort et std::ranges::find cvm proiectione, et ordinationem stabilem ab ea qvae non est distingvere.
  4. Data problematis tabvlariis effingere et ostendere cvr hi campi et haec genera eligantvr.

Data congregare

Vectores paralleli

Fingatvr programma, pro qvoqve discipvlo gregis, nomen, aestimationem et aetatem servare debere. Ex iis qvae vsqve ad lectionem Tabvlae visa svnt, solvtio in promptv est tres vectores, vnvs pro qvaqve proprietate, cvm conventione vt index ii eandem personam in omnibvs tribvs designet: names[i], grades[i] et ages[i]. Hi vectores paralleli vocantvr. Tabvla non svfficit, qvia omnes eivs cellae eivsdem generis esse debent, et nomen nvmervs non est.

Programma in C++
#include <algorithm>#include <cstddef>#include <print>#include <string>#include <vector>​int main(){    const std::vector<std::string> names{"Ana", "Luis", "Eva"};    std::vector<int> grades{6, 4, 7};    const std::vector<int> ages{19, 22, 20};    std::ranges::sort(grades);    for (std::size_t i{0}; i < names.size(); ++i) {        std::println("{}: aestimatio {}, aetas {}", names[i], grades[i], ages[i]);    }}
Exitvs
Ana: aestimatio 4, aetas 19Luis: aestimatio 6, aetas 22Eva: aestimatio 7, aetas 20

Programma discipvlos secvndvm aestimationem ordinare volebat, et solas aestimationes ordinavit. Sine monitis compilatvr, neqve detector errorvm memoriae, AddressSanitizer, neqve detector modi agendi indefiniti, UndefinedBehaviorSanitizer, qvicqvam habet qvod nvntiet; attamen exitvs eivs falsvs est: Ana 6 habebat et cvm 4 apparet. Conventio qvae tres vectores conivngebat nvsqvam scripta est vbi compilator eam legere possit, ita vt nihil prohibeat qvominvs rvmpatvr. Inde seqvitvr fragilitas vectorvm parallelorvm: omnis operatio qvae elementvm movet, addit vel avfert in omnibvs repeti debet, eodem modo et eodem ordine; et satis est vnvm oblivisci vt data tacite corrvmpantvr.

ExemplvmOrdines qvi discordant et schedae qvae integrae moventvr

Tres vectores paralleli contra vnvm vectorem schedarvm, qvarvm qvaeqve tria data vnivs personae continet.

Demonstratio

  1. Colvmna 0 vnam personam describit: names[0], grades[0] et ages[0] svnt nomen, aestimatio et aetas Anae. Vincvlvm solvs index est.

  2. std::ranges::sort(grades) vnvm tantvm ordinem rvrsvs disponit. Alteri dvo nihil sentivnt: colvmna 0 nvnc nomen Anae, aestimationem Lvis et aetatem Anae conivngit, qvae nvllivs svnt.

  3. Altera via: vnvs vector, cvivs elementa schedae svnt. Qvaeqve scheda tria data vnivs personae continet, et vincvlvm inter ea iam non est conventio de indicibvs, sed ipsa scheda.

  4. Secvndvm aestimationem ordinare schedas integras movet: scheda Lvis in primvm locvm transit cvm nomine et aetate qvae in ea scripta svnt. Nvllvm datvm a ceteris separari potest, qvia operatio ea separatim non videt.

Si ita est, id qvod problema postvlat est genvs cvivs valores schedae sint: valor qvi nomen, aestimationem et aetatem contineat, et qvi vt totvm exscribatvr, fvnctioni transmittatvr, in vectore servetvr et ordinetvr. C++ id paratvm non praebet, qvia schedae cvivsqve problematis diversae svnt; sed programmatori permittit vt id definiat. Id genvs est tabvlarivm.