Ad argvmentvm transi
Topos Uranos

Svmmarivm

std::array postvlat vt iam in compilatione sciatvr qvot elementa habitvra sit; plerisqve avtem problematibvs id non dicitvr nisi cvm data advenivnt. Haec lectio std::vector praebet, seqventiam qvae cvm datis crescit: qvomodo creetvr, qvomodo ei per push_back elementa addantvr et qvomodo per eam seqventiae longitvdinis ignotae legantvr. Seqvvntvr tres percvrsvs canonici omnis programmationis cvm collectionibvs (accvmvlare, colare et transformare), cvm circvitv et cvm algorithmis bibliothecae; transmissio vectoris ad fvnctionem, et cvr vectorem novvm reddere parvo constet. Lectionem clavdit interior vectoris strvctvra: eivs magnitvdo et capacitas, spativm memoriae qvod, cvm plenvm est, alio dvplo maiore svbstitvitvr, et referentia ad elementvm qvae propterea in memoriam liberatam spectare potest.

Proposita discendi

  1. std::vector creare, ei per push_back elementa addere evmqve percvrrere, per evm seqventiam datorvm longitvdinis ignotae legendo.
  2. Fvnctiones scribere qvae vectorem per referentiam constantem accipiant vt evm legant et per referentiam vt evm mvtent, qvaeqve vectorem novvm reddant cvm eventvs seqventia est.
  3. Percvrsvs accvmvlationis, colationis et transformationis implementare, in problemate formam qvae ei respondet agnoscere eamqve, cvm bibliotheca sinit, per std::ranges::count, std::ranges::max vel std::ranges::fold_left breviter scribere.
  4. Exemplo explicare discrimen inter magnitvdinem et capacitatem vectoris, et cvr referentia ad elementvm irrita fieri possit cvm alivd additvr.

Seqventia qvae crescit

Vectorem creare et implere

Lectio Series seqventiam indicatam praebvit: elementa eivsdem generis, alivd post alivd, a nihilo nvmerata. Eivs forma hodierna magnitvdinis fixae, std::array<int, 7>, magnitvdinem in genere fert, et compilator eam nosse debet. Atqvi qvi programma scribit qvod mediam aestimationvm cvrsvs compvtat nescit qvot discipvlos cvrsvs habitvrvs sit. Inde seqvitvr opvs esse seqventia cvivs magnitvdo datvm sit vnvm praeterea, qvod inter exseqvendvm mvtetvr: est vector, std::vector<T>, ex plica capitis <vector>, vbi T genvs elementorvm est.

Programma in C++
#include <print>#include <vector>​int main(){    std::vector<int> squares{};    std::println("Initio: magnitvdo {}, vacvvs: {}", squares.size(), squares.empty());    for (int k{1}; k <= 5; ++k) {        squares.push_back(k * k);    }    std::println("{}", squares);    std::println("Magnitvdo {}, primvm {}, vltimvm {}", squares.size(), squares[0], squares.back());    squares[1] = 0;    squares.pop_back();    std::println("{}", squares);}
Exitvs
Initio: magnitvdo 0, vacvvs: true[1, 4, 9, 16, 25]Magnitvdo 5, primvm 1, vltimvm 25[1, 0, 9, 16]

Versvs 6 vectorem vacvvm integrorvm creat: contra atqve in serie, non opvs est nvntiare qvot elementa habitvrvs sit. size() reddit qvot habeat, et empty() dicit vtrvm nvllvm habeat. Circvitvs versvvm 8 ad 10 qvinqve qvadrata per push_back addit, qvod argvmentvm svvm in fine ponit et magnitvdinem vno avget. Versvs 11 vectorem totvm scribit cvm forma intervallorvm qva lectio svperior in seriebvs vsa est. Accessvs per indicem is est qvi semper, et squares.back() breviter dicit squares[squares.size() - 1]. Versvs 13 elemento exsistenti valorem assignat, et versvs 14 vltimvm per pop_back tollit. Operationes hvivs lectionis svnt, svmmatim, hae.

  • v.push_back(x) x in fine addit; v.pop_back() vltimvm tollit (vectore vacvo, modvs agendi indefinitvs est).
  • v.size() est magnitvdo, generis std::size_t, integri sine signo magnitvdinvm qvod lectio Series praebvit; v.empty() idem valet atqve v.size() == 0.
  • v[i] et v.at(i) elementvm indicis i dant, qvi condicioni i < v.size() satisfacere debet; v.front() et v.back() primvm et vltimvm dant, et postvlant ne vector vacvvs sit.
  • v.resize(n) vectorem cvm n elementis relinqvit: tollit qvae in fine svpersvnt, avt in fine addit elementa initialisata vt cvm vncis vacvis (nihila, si nvmeri svnt).

Vt in seriebvs, v[i] nvllvm examen praestat, v.at(i) avtem praestat: cvm indice 7 et qvinqve elementis, programma sistit cvm nvntio vector::_M_range_check: __n (which is 7) >= this->size() (which is 5), qvod indicem et magnitvdinem nominat. Mechanismvs qvi hanc intermissionem efficit, exceptio, in Programmatione Lingva C++ II tractatvr.

Vnci et parentheses

Cvrsvs omnia cvm vncis initialisat, et vector est primvm genvs cvrsvs in qvo vncos parenthesibvs mvtare eventvm mvtat. Cvm vncis, valores scripti svnt elementa; cvm parenthesibvs, primvs nvmervs est nvmervs elementorvm et secvndvs, si adest, valor cvivsqve.

Programma in C++
#include <print>#include <vector>​int main(){    const std::vector<int> a{5};    const std::vector<int> b(5);    const std::vector<int> c{3, 7};    const std::vector<int> d(3, 7);    std::println("{} {} {} {}", a, b, c, d);}
Exitvs
[5] [0, 0, 0, 0, 0] [3, 7] [7, 7, 7]

a vnvm elementvm habet, 5; b, qvinqve nihila; c, 3 et 7; d, tria septena. Index inter vncos igitvr dicit «haec svnt elementa», et parentheses servantvr ad petenda n exempla eivsdem valoris, vt vectorem nvmeratorvm in nihilo positorvm.

Vltimvm vectoris vacvi

Vector vacvvs casvs legitimvs est (introitvs sine datis, colvm qvod nemo transit), et qvaeqve formvla cvm eivs magnitvdine in eo casv recensenda est; insidiosissima est v.size() - 1. Cvm v.size() integrvm sine signo sit, si ab eo 1 detrahitvr cvm 0 valet, non fit −1-1, sed rota circvmagitvr, vt in lectione Nvmeri integri eorvmqve repraesentatio visvm est, vsqve ad maximvm valorem generis std::size_t.

Programma in C++
#include <cstddef>#include <print>#include <vector>​int main(){    const std::vector<int> values{};    std::println("values.size() - 1 = {}", values.size() - 1);    // Limes errans: cvm vectore vacvo, condicio vera est.    for (std::size_t i{0}; i <= values.size() - 1; ++i) {        std::println("{}", values[i]);    }}
Exitvs
values.size() - 1 = 18446744073709551615/usr/include/c++/15/bits/stl_vector.h:1282: constexpr std::vector< <template-parameter-1-1>, <template-parameter-1-2> >::const_reference std::vector< <template-parameter-1-1>, <template-parameter-1-2> >::operator[](size_type) const [with _Tp = int; _Alloc = std::allocator<int>; const_reference = const int&; size_type = long unsigned int]: Assertion '__n < this->size()' failed.

Systema programma signo 6 sistit.

Primvs versvs exitvs est 18 446 744 073 709 551 61518\,446\,744\,073\,709\,551\,615, id est 264−12^{64} - 1, maximvm std::size_t hvivs svggestvs. Inde seqvitvr condicionem circvitvs, 0 <= 18446744073709551615, veram esse, et primvm gyrvm legere values[0] ex vectore qvi elementvm 0 non habet: modvs agendi indefinitvs. Qvod observatvr ab optionibvs pendet, vt in seriebvs: sine optimizatione compilata, bibliotheca GCC 15 indicem ipsivs operator[] examinat et programma sistit per assertionem qvae dicit __n < this->size(); cvm optimizatione hoc examen evanescit, et circvitvs, qvi non in tempore sistit, legere conatvr vbi nvllvm omnino elementvm est (confirmatvm in Linux cvm -O2: qvia vector vacvvs nvllvm spativm memoriae habet, programma violatione segmenti finitvr, sine nvntio qvi cavsam explicet). Correctio est limitem sine svbtractione scribere, i < values.size(), qvi cvm vectore vacvo inde ab initio falsvs est; et vbi svbtractio necessaria videtvr, privs values.empty() interrogare.