Svmmarivm
Mvlta data non vnam lineam, sed reticvlvm formant: aestimationes cvrsvs per discipvlos et per examina, alvevs lvsorivs, matrix. Haec lectio tabvlam praebet, strvctvram dvarvm dimensionvm, in dvabvs eivs formis lingvae C++: vectorem vectorvm, cvivs magnitvdo inter exseqvendvm decernitvr, et seriem seriervm, cvivs magnitvdo in compilando nota est. Seqvvntvr percvrsvs per ordines et per colvmnas; transposita et prodvctvm matricvm, svmptv cvbico; vicinae cellae, qvae oras cavere cogvnt; et tabvla in vno vectore servata per indicem i * columns + j, qvo modo memoria eam videt.
Proposita discendi
- Tabvlam vt
std::vector<std::vector<T>>vel vtstd::arrayexstd::arrayrepraesentare, et inter vtramqve eligere provt magnitvdo in compilando nota sit necne. - Tabvlam per ordines et per colvmnas percvrrere, et svmmas et medias cvivsqve ordinis et cvivsqve colvmnae compvtare.
- Operationes tabvlarvm implementare (transpositam, prodvctvm matricvm, nvmerationem vicinarvm cellae) cavendo ne vllvs index extra oras exeat.
- Tabvlam in vectore plano per indicem
i * columns + jrepraesentare, et exemplo explicare congrventiam inter cellam et eivs positionem.
Tabvlae
Ordines et colvmnae
Tabvla ordinvm et colvmnarvm est collectio datorvm eivsdem generis, qvorvm qvodqve dvobvs indicibvs designatvr: indice ordinis svi, , cvm , et indice colvmnae svae, , cvm . Mathematica eam matricem appellat et scribit ; cvrsvs Algebra et Geometria II matrices earvmqve operationes tractat, et haec lectio qvasdam vt programmata scribit. Svccessio indicvm nvllam exceptionem admittit: primvm ordo, deinde colvmna. Eos confvndere est error in tabvlis freqventissimvs, et compilator de eo monere non potest, qvia vterqve index eivsdem generis est.
Lectio Vectores seqventiam magnitvdinis variabilis praebvit. Qvod si ita est, tabvla est seqventia ordinvm, et qvisqve ordo ipse seqventia est: vector cvivs elementa vectores svnt, std::vector<std::vector<int>>.
#include <print>#include <vector>int main(){ std::vector<std::vector<int>> table{{1, 2, 3}, {4, 5, 6}}; std::println("{}", table); std::println("Ordines {}, colvmnae {}", table.size(), table[0].size()); std::println("Ordo 1: {}; ordo 1, colvmna 2: {}", table[1], table[1][2]); table[0][1] = 20; for (const std::vector<int>& row : table) { for (const int value : row) { std::print("{:>4}", value); } std::println(""); } const std::vector<std::vector<int>> zeros(3, std::vector<int>(4)); std::println("{}", zeros);}[[1, 2, 3], [4, 5, 6]]Ordines 2, colvmnae 3Ordo 1: [4, 5, 6]; ordo 1, colvmna 2: 6 1 20 3 4 5 6[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]Versvs 6 tabvlam scribit vt catalogvm ordinvm, qvemqve inter svos vncos cvrvos, et forma intervallorvm eam eodem modo imprimit, inter vncos qvadratos. table.size() est nvmervs ordinvm, et table[0].size() longitvdo primi, qvae in tabvla bene formata est nvmervs colvmnarvm. table[1] est ordo 1 totvs, std::vector<int>, et table[1][2] elementvm 2 eivs ordinis: dvplex index non est operatio nova, sed dvo accessvs continvi; primvs ordinem eligit et secvndvs, intra evm, colvmnam. Versvs 11 ad 16 tabvlam vt reticvlvm scribvnt dvobvs circvitibvs for per intervallvm nidificatis; ordo per referentiam constantem accipitvr ne in qvoqve gyro exscribatvr. Versvs 17 tabvlam 3 per 4 zeris plenam creat: cvm parenthesibvs, vt in lectione Vectores, petvntvr 3 exempla ordinis qvattvor zerorvm.
Tabvla 3 per 4, ordine post ordinem percvrsa (i in circvitv exteriore) et deinde colvmna post colvmnam (circvitibvs permvtatis). Qvaeqve cella nvmervm svae visitationis ostendit.
Demonstratio
Tabvla, cvm indicibvs ordinvm ad sinistram et indicibvs colvmnarvm svpra.
Per ordines: cvm , circvitvs interior percvrrit.
Cvm , circvitvs interior rvrsvs a incipit.
Cvm : tabvla percvrsa est vt textvs legitvr, linea post lineam.
Per colvmnas: cvm , circvitvs interior percvrrit.
Cvm , secvnda colvmna.
Cvm .
Cvm . Qvaeqve cella rvrsvs semel omnino visitata est: circvitvs permvtare non mvtat qvid visitetvr, sed qvando.
Ordines longitvdinvm diversarvm
Nihil cogit ordines vectoris vectorvm eandem longitvdinem habere: qvisqve est vector independens. Interdvm id est qvod volvmvs, vt in triangvlo Pascalis; sed in tabvla, qvae definitione rectangvla est, ordo brevior est error datorvm, et programma qvod table[0].size() vt nvmervm colvmnarvm adhibet extra evm legit. Tabvla igitvr qvae extrinsecvs advenit examinanda est.
#include <print>#include <vector>// Praecondicio: nvlla.// Postcondicio: reddit true si table saltem vnvm ordinem habet et omnes// eivs ordines longitvdinem primi habent.bool isRectangular(const std::vector<std::vector<int>>& table){ if (table.empty()) { return false; } for (const std::vector<int>& row : table) { if (row.size() != table[0].size()) { return false; } } return true;}int main(){ const std::vector<std::vector<int>> pascal{{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}}; const std::vector<std::vector<int>> grid{{1, 2, 3}, {4, 5, 6}}; std::println("{} {}", pascal, isRectangular(pascal)); std::println("{} {}", grid, isRectangular(grid));}[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1]] false[[1, 2, 3], [4, 5, 6]] trueFvnctio tabvlam sine ordinibvs exclvdit, in qva table[0] non exstat. Fvnctiones hvivs lectionis qvae table[0].size() legvnt in praecondicione sva tabvlam rectangvlam nec vacvam postvlant, et isRectangular eam praestare sinit.
Series seriervm
Cvm dimensiones in compilando notae svnt (tabvla scaccorvm, qvadratvm magicvm), tabvla esse potest std::array ex std::array: std::array<std::array<int, 3>, 3> ab interiore ad exteriora legitvr, «3 ordines 3 integrorvm». Exemplo est qvadratvm magicvm lateris 3, cvivs ordines, colvmnae et diagonales svmmam 15 habent.
#include <array>#include <print>int main(){ constexpr std::array<std::array<int, 3>, 3> magic{{ {2, 7, 6}, {9, 5, 1}, {4, 3, 8}, }}; std::println("{}", magic); std::println("Centrvm {}, {} octeti", magic[1][1], sizeof(magic));}[[2, 7, 6], [9, 5, 1], [4, 3, 8]]Centrvm 5, 36 octetiVnci cvrvi in vtroqve extremo tres svnt. std::array vnvm tantvm membrvm habet, seriem C, ita vt vncvs exterior sit ipsivs std::array, secvndvs eivs seriei interioris, et tertivs demvm cvivsqve ordinis. Cvm dvobvs vncis, primvs ordo vt initialisator seriei interioris accipitvr, et secvndvs iam nihil habet qvod initialiset.
#include <array>#include <print>int main(){ const std::array<std::array<int, 3>, 2> table{{1, 2, 3}, {4, 5, 6}}; std::println("{}", table);}main.cpp: In function ‘int main()’:main.cpp:6:71: error: too many initializers for ‘const std::array<std::array<int, 3>, 2>’ 6 | const std::array<std::array<int, 3>, 2> table{{1, 2, 3}, {4, 5, 6}}; | ^Too many initializers: svperest index {4, 5, 6}. Index planvs, {1, 2, 3, 4, 5, 6}, etiam compilatvr et ordines seriatim implet, sed formam tabvlae celat; cvrsvs tres vncos scribit.
Triginta sex octeti ipsivs sizeof svnt novem int qvaternorvm octetorvm (magnitvdo vsitata, qvam norma non praestat), nihil praeterea: series seriervm ordines alivm post alivm in vno spatio memoriae servat. Vector vectorvm, contra, vnvm spativm memoriae per ordinem petit, praeter id ordinvm, et ea spatia contigva esse non necesse est. Electio igitvr seqvitvr regvlam lectionvm Series et Vectores.
- Si vtraqve dimensio in compilando nota est, series seriervm: vnvm spativm memoriae, forma rectangvla per genvs praestita et facvltas
constexpr. - Si altera solvm inter exseqvendvm nota est, vector vectorvm, cvm officio examinandi ordines eandem longitvdinem habere, vel vector planvs vltimae sectionis.
Argvmentvm oneratvr…