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
std::vectorcreare, ei perpush_backelementa addere evmqve percvrrere, per evm seqventiam datorvm longitvdinis ignotae legendo.- 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.
- Percvrsvs accvmvlationis, colationis et transformationis implementare, in problemate formam qvae ei respondet agnoscere eamqve, cvm bibliotheca sinit, per
std::ranges::count,std::ranges::maxvelstd::ranges::fold_leftbreviter scribere. - 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.
#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);}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)xin fine addit;v.pop_back()vltimvm tollit (vectore vacvo, modvs agendi indefinitvs est).v.size()est magnitvdo, generisstd::size_t, integri sine signo magnitvdinvm qvod lectio Series praebvit;v.empty()idem valet atqvev.size() == 0.v[i]etv.at(i)elementvm indicisidant, qvi condicionii < v.size()satisfacere debet;v.front()etv.back()primvm et vltimvm dant, et postvlant ne vector vacvvs sit.v.resize(n)vectorem cvmnelementis 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.
#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);}[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 , sed rota circvmagitvr, vt in lectione Nvmeri integri eorvmqve repraesentatio visvm est, vsqve ad maximvm valorem generis std::size_t.
#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]); }}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 , id est , 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.
Argvmentvm oneratvr…