Bevezetés
A tömb ugyanazon objektumtípusok sorozata egymást követő memóriahelyeken. Egy tömb nem növelheti az érc hosszát. A vektor olyan, mint egy tömb, de hossza növelhető vagy csökkenthető. A vektornak tehát sokkal több művelete van, mint egy tömbnek.
A C ++ sok könyvtárral rendelkezik, amelyek mindegyike a C ++ szabványos könyvtárat alkotja. Ezen könyvtárak egyike a konténertár. A tároló objektumok gyűjteménye, és bizonyos műveleteket el lehet végezni a gyűjteményen. A C ++ konténerek két csoportba sorolhatók: szekvencia konténerek és asszociatív konténerek. A szekvencia konténerek a következők: vektor, tömb (nem ugyanaz a tömb, amiről korábban tárgyaltunk), deque, forward_list és list. Ezek különböző gyűjtemények (tömbszerű adatszerkezetek), és mindegyik külön kompromisszumokat kínál.
Bármely programozónak tudnia kell, hogyan kell eldönteni, hogy vektort, tömböt, deque-t, forward_list-ot vagy listát használ-e. Ha egy programozónak olyan struktúrára van szüksége, amely több műveletet igényel, mint a közönséges tömbhöz társított, akkor a közönséges tömböt nem szabad használni.
Ha a feladat gyakori beillesztéseket és törléseket tartalmaz a sorozat közepén, akkor egy listát vagy előre_listát kell használni. Ha a feladat gyakori beillesztéseket és törléseket tartalmaz a sorozat elején vagy végén, akkor deque-ot kell használni. Ha ilyen műveletekre nincs szükség, akkor vektort kell használni.
Ez a cikk bemutatja a C ++ vektor használatát. A cikk megértéséhez szüksége lesz némi ismeretre a C ++ mutatókról, hivatkozásokról és tömbökről.
Osztály és objektumok
Az osztály olyan változók és függvények együttese, amelyek együttesen működnek, ahol a változókhoz nincs hozzárendelve érték. Ha a változókhoz értékeket rendelünk, akkor egy osztály objektummá válik. Ugyanazon osztálynak adott különböző értékek különböző objektumokat eredményeznek; vagyis a különböző objektumok ugyanabba az osztályba tartozhatnak, de eltérő értékekkel rendelkeznek. Objektum létrehozása egy osztályból az objektum példányosításának is nevezik.
A vektor kifejezés leír egy osztályt. A vektorból létrehozott objektumnak van egy neve, amelyet a programozó választ.
Egy osztályhoz tartozó függvényre van szükség egy objektum példányosításához az osztályból. A C ++ nyelven ennek a függvénynek ugyanaz a neve, mint az osztály nevének. Az osztályból létrehozott (példányosított) különböző tárgyaknak külön nevük van, amelyeket mindegyiknek a programozó adott.
Objektum létrehozása osztályból azt jelenti, hogy az objektumot össze kell állítani; ez a tárgy példányosítását is jelenti.
A vektor osztály
A vektorosztály már definiálva van, és a könyvtárban van. A vektorosztály használatához a programozónak be kell építenie a vektor fejlécét a fájlba a következő előfeldolgozási irányelvvel:
#includeA fejléc beillesztése után az összes vektorjellemző (adattagok és tagfunkciók) hozzáférhetővé válik. Ahhoz, hogy a számlálóobjektum adatokat kimenjen a terminálra (konzolra), az objektum fejlécét is be kell illeszteni. A program vektorral történő írásához legalább a következő fejléceket kell tartalmaznia:
#include#include
Egy vektor beidegzése
int foo [10];Fent egy tömb deklarációja szerepel a „foo” névvel és a „10.”Ez egy egész tömb. A vektor deklarálása hasonló. Egy vektor esetében az elemek száma nem kötelező, mivel a vektor hossza nőhet vagy csökkenhet.
A program ezen a pontján a vektor osztály már definiálva van a könyvtárban, és a fejléc is benne van. A vektor az alábbiak szerint példányosítható:
std :: vektorItt a vektor a speciális konstruktor függvény. A vektor által tárolt adatok típusa „int”, szögletes zárójelben. A „vtr” kifejezés a programozó által a vektor számára választott név. Végül a zárójelben szereplő „8” az a kezdő egész szám, amelyre a vektornak szüksége van.
Az „std” kifejezés a szokásos névteret jelenti. Ezt a kifejezést ebben a kontextusban kettős kettőspontnak kell követnie. Bárki megírhatja saját vektor osztály könyvtárát és használhatja azt. Ugyanakkor a C ++ már rendelkezik egy szabványos könyvtárral, amely szabványos nevekkel rendelkezik, beleértve a „vektort.”A szabványos név használatához a standard név előtt állnia kell: std :: . Annak elkerülése érdekében, hogy az std :: minden alkalommal beírjon egy szabványos nevet a programba, a programfájl a következőképpen indulhat el:
#include#include
névtér használata std;
Funkció túlterhelése
Ha két vagy több különböző funkció aláírásnak ugyanaz a neve, akkor azt mondják, hogy ez a név túlterhelt. Egy függvény meghívásakor az argumentumok száma és típusa határozza meg, hogy melyik függvényt hajtják végre.
Vektor szerkesztése
A vektor felépítése egy vektorobjektum példányosítását (létrehozását) jelenti. A konstruktor funkció az alábbiak szerint van túlterhelve:
vektor
Ezzel létrejön egy nulla hosszú és „T” típusú vektor.”A következő utasítás egy„ float ”típusú nulla hosszúságú vektort hoz létre a„ vtr: ”névvel
vektorvektor
Ez egy vektort hoz létre, amelynek n „T” típusú eleme van.”A négy úszó elemmel rendelkező vektor állítása a következő:
vektorvektor
Ez létrehoz egy n elemből álló vektort, amely inicializálva van a t értékre. A következő utasítás 5 elemből álló vektort hoz létre, ahol minden elemnek 3 az értéke.4:
vektorKonstrukció az inicializálással
Egy vektort egyszerre lehet létrehozni (létrehozni) és inicializálni, a következő két módon:
vektorVagy
vektorVegye figyelembe, hogy az objektum neve után nincsenek zárójelek. Az objektum neve után közvetlenül használt zárójeleknek tartalmazniuk kell az inicializáló listát, az alábbiak szerint:
vektorEgy vektor később elkészíthető és inicializálható az inicializáló listával. Ebben az esetben a zárójeleket nem használjuk:
vektorvtr = 1.1, 2.2, 3.3, 4.4;
vektor
Ez egy másolatkészítő. V2 vektort hoz létre a V1 vektor másolataként. A következő kód ezt szemlélteti:
vektorvektor
Vektor hozzárendelése az építkezés során
Az építés során egy üres vektort lehet létrehozni, miközben hozzárendelünk hozzá egy másikat, az alábbiak szerint:
vektorvektor
A második állítás egyenértékű:
vektorconst vektor
A const vektor olyan vektor, amelynek elemeit nem lehet megváltoztatni. A vektor értékei csak olvashatók. Létrehozásakor a vektor a következőképpen jelenik meg:
const vektorEbben a vektortípusban nem lehet elemet hozzáadni vagy eltávolítani. Sőt, semmilyen érték nem változtatható meg.
Konstrukció az Iteratorral
A sablon általános ábrázolást ad az adattípushoz. Az iterátor egy reprezentatív reprezentációt nyújt a beolvasáshoz egy tároló értékein keresztül. Az iterátorral létrehozott vektor szintaxisa a következő:
sablonvektor (InputIterator először, InputIterator utolsó, const Allocator & = Allocator ());
Ez létrehoz egy vektort az [első, utolsó) tartományhoz a megadott allokátor segítségével, amelyet később a cikkben tárgyalunk.
Egy vektor megsemmisítése
A vektor megsemmisítéséhez egyszerűen engedje meg, hogy kilépjen a hatókörből, és a megsemmisítést automatikusan kezeljük.
Vektor kapacitás
size_type kapacitás () const noexcept
A kapacitás-tag függvény visszaadja azon elemek teljes számát, amelyeket a vektor megtarthat anélkül, hogy újra kellene osztani őket. Ennek kódszegmense a következő:
vektorint szám = vtr.kapacitás();
cout << num << '\n';
A kimenet 4.
tartalék (n)
A memóriaterület nem mindig érhető el szabadon. Extra hely előre lefoglalható. Vegye figyelembe a következő kódszegmenst:
vektorvtr.tartalék (6);
cout << vtr.capacity() << '\n';
A kimenet 6. Tehát a fenntartott extra hely 6 - 4 = 2 elem. A függvény érvénytelen.
size () const noexcept
Ez visszaadja a vektor elemeinek számát. A következő kód szemlélteti ezt a funkciót:
vektorúszó sz = vtr.méret();
cout << sz << '\n';
A kimenet 4.
shrink_to_fit ()
Miután extra kapacitást adott egy vektornak a reserve () függvénnyel, a vektor lefelé méretezhető, hogy illeszkedjen az eredeti méretéhez. A következő kód ezt szemlélteti:
vektorvtr.tartalék (6);
vtr.shrink_to_fit ();
int sz = vtr.méret();
cout << sz << '\n';
A kimenet 4 és nem 6. A függvény érvénytelen.
átméretezés (sz), átméretezés (sz, c)
Ez átméretezi a vektort. Ha az új méret kisebb, mint a régi méret, akkor a végén lévő elemek törlődnek. Ha az új méret hosszabb, akkor a vége felé néhány alapértelmezett értéket adunk hozzá. Egy adott hozzáadott érték eléréséhez használja a resize () függvényt két argumentummal. Az alábbi kódszegmens szemlélteti e két funkció használatát:
vektorvtr1.átméretezés (2);
cout << "New size of vtr1: " << vtr1.size() << '\n';
vektor
vtr2.átméretezés (4, 8.8.);
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
A kimenet a következő:
Új méretű vtr1: 2vtr2: 1.1 2.2 8.8 8.8
A funkciók érvénytelenek.
üres () const noexcept
Ez a függvény 1-t ad vissza true értékre, ha nincs elem a vektorban, és 0-t hamis értékre, ha a vektor üres. Ha egy vektornak 4 helye van egy adott típusú adathoz, például úszóhoz, úszóérték nélkül, akkor az a vektor nem üres. A következő kód ezt szemlélteti:
vektorcout << vtr.empty() << '\n';
vektor
cout << vt.empty() << '\n';
vektor
cout << v.empty() << '\n';
A kimenet a következő:
10
0
Vektor elem hozzáférés
A vektorok tömbhöz hasonlóan szkriptelhetők (indexelhetők). Az indexszámlálás nullától kezdődik.
vectorName [i]
A „vectorName [i]” művelet hivatkozást ad az i-ben lévő elemreth a vektor indexe. A következő kódkimenetek 3.3 a fenti vektorhoz:
vektorúszó fl = vtr [2];
cout << fl << '\n';
vectorName [i] const
A „vectorName [i] const” műveletet a „vectorName [i]” helyett hajtjuk végre, ha a vektor állandó vektor. Ezt a műveletet a következő kódban használják:
const vektorúszó fl = vtr [2];
cout << fl << '\n';
A kifejezés állandó hivatkozást ad vissza az i-reth a vektor eleme.
Érték hozzárendelése Subscript-hez
Egy érték nem állandó vektorhoz rendelhető az alábbiak szerint:
vektorvtr [2] = 8.8;
cout << vtr[2] << '\n';
A kimenet 8.8.
vectorName.az i) pontnál
„VectorName.az (i) -nél ”olyan, mint a„ vectorName [i] ”, de a„ vectorName ”.az (i) pontnál ”megbízhatóbb. A következő kód megmutatja, hogy ezt a vektort hogyan kell használni:
vektorúszó fl = vtr.a (2) -nél;
cout << fl << '\n';
at () egy vektor tag függvény.
vectorName.az (i) konst
„VectorName.az (i) const-nál "olyan, mint a" vectorName [i] const ", de a" vectorName ".az (i) const-nál ”megbízhatóbb. „VectorName.at (i) const ”a„ vectorName ”helyett kerül végrehajtásra.az (i) pontnál ”, amikor a vektor állandó vektor. Ezt a vektort a következő kódban használják:
const vektorúszó fl = vtr.a (2) -nél;
cout << fl << '\n';
az () const egy vektortagfüggvény.
Érték hozzárendelése az at () függvénnyel
Egy nem konstans vektorhoz az at () függvénnyel lehet értéket rendelni az alábbiak szerint:
vektorvtr.a (2) -nél = 8.8;
cout << vtr[2] << '\n';
A kimenet 8.8.
Probléma az alszkriptekkel
Az alszkripteléssel (indexeléssel) az a probléma, hogy ha az index a tartományon kívül esik, nullát adhatunk vissza, vagy hibát adhatunk ki futás közben.
elülső()
Ez egy hivatkozást ad vissza a vektor első elemére anélkül, hogy eltávolítaná az elemet. A következő kód kimenete 1.1.
vektorúszó fl = vtr.elülső();
cout << fl << '\n';
Az elem nem kerül eltávolításra a vektorból.
elülső () konst
Ha a vektor felépítését const előzi meg, akkor a „front () const” kifejezés kerül végrehajtásra a „front () helyett.”Ezt a következő kódban használják:
const vektorúszó fl = vtr.elülső();
cout << fl << '\n';
Egy állandó referenciát adunk vissza. Az elem nem kerül eltávolításra a vektorból.
vissza()
Ez visszaadja a hivatkozást a vektor utolsó elemére anélkül, hogy eltávolítaná az elemet. A következő kód kimenete 4.4.
vektorúszó fl = vtr.vissza();
cout << fl << '\n';
vissza () konst
Ha a vektor felépítését const előzi meg, akkor a „back () const” kifejezés kerül végrehajtásra a „back () helyett.”Ezt a következő kódban használják:
const vektorúszó fl = vtr.vissza();
cout << fl << '\n';
Egy állandó referenciát adunk vissza. Az elem nem kerül eltávolításra a vektorból.
Vektoros adatelérés
adatok () noexcept; data () const noexcept;
Ezek bármelyike olyan mutatót ad vissza, hogy az [adatok (), adatok () + méret ()] érvényes tartomány.
Erről a cikk későbbi részében lesz szó.
Visszatérő iterátorok és a vektor
Az iterátor olyan, mint egy mutató, de több funkcióval rendelkezik, mint egy mutató.
kezdődik () noexcept
Visszaad egy iterátort, amely a vektor első elemére mutat, a következő kódszegmenshez hasonlóan:
vektorvektor
cout << *iter << '\n';
A kimenet 1.1. Vegye figyelembe, hogy az iterátort fogadó deklarációt deklarálták. Az iterátor egy visszatérési kifejezésben kerül levezetésre, hogy az értéket ugyanúgy megszerezze, mint egy mutatót.
begin () const noexcept;
Visszaad egy iterátort, amely a vektor első elemére mutat. Amikor a vektorkonstrukciót megelőzi a const, a „begin () const” kifejezés kerül végrehajtásra a „begin () helyett.”Ilyen feltétel mellett a vektor megfelelő eleme nem módosítható. Ezt a következő kódban használják:
const vektorvektor
cout << *iter << '\n';
A kimenet 1.1. Ne feledje, hogy a visszatérő iterátor fogadásához ezúttal a „const_iterator” szót használták az „iterator” helyett.
end () noexcept
Olyan iterátort ad vissza, amely közvetlenül a vektor utolsó elemén túlmutat. Vegye figyelembe a következő kódszegmenst:
vektorvektor
cout << *iter << '\n';
A kimenet 0, ami értelmetlen, mivel az utolsó elemen túl nincs konkrét elem.
end () const noexcept
Olyan iterátort ad vissza, amely közvetlenül a vektor utolsó elemén túlmutat. Ha a vektor felépítését „const” előzi meg, akkor a „end () const” kifejezés kerül végrehajtásra."Vegye figyelembe a következő kódszegmenst:
const vektorvektor
cout << *iter << '\n';
A kimenet 0. Ne feledje, hogy a visszatérő iterátor fogadásához ezúttal a „const_iterator” szót használták az „iterator” helyett.
Fordított iteráció
Lehetséges olyan iterátor, amely a végétől az első elemig közvetlenül ismétlődik.
rbegin () noexcept
Visszaad egy iterátort, amely a vektor utolsó elemére mutat, a következő kódszegmenshez hasonlóan:
vektorvektor
cout << *rIter << '\n';
A kimenet 4.4.
Ne feledje, hogy azt a deklarációt deklarálták, amely a fordított iterátort kapja. Az iterátor egy visszatérési kifejezésben kerül levezetésre, hogy az értéket ugyanúgy megszerezze, mint egy mutatót.
rbegin () const noexcept;
Visszaad egy iterátort, amely a vektor utolsó elemére mutat. Amikor a vektor felépítését „const” előzi meg, akkor az „rbegin () helyett az„ rbegin () const ”kifejezés kerül végrehajtásra.”Ilyen feltétel mellett a vektor megfelelő eleme nem módosítható. Ez a szolgáltatás a következő kódban használható:
const vektorvektor
cout << *rIter << '\n';
A kimenet 4.4.
Ne feledje, hogy a const_reverse_iterator-t ezúttal a fordított_iterator helyett használták a visszaadott iterátor fogadására.
rend () noexcept
Visszaad egy iterátort, amely közvetlenül a vektor első eleme előtt mutat. Vegye figyelembe a következő kódszegmenst:
vektorvektor
cout << *rIter << '\n';
A kimenet 0, ami értelmetlen, mivel közvetlenül az első elem előtt nincs konkrét elem.
rend () const noexcept
Visszaad egy iterátort, amely közvetlenül a vektor első eleme előtt mutat. Amikor a vektor felépítését „const” előzi meg, a „rend ()” helyett a „rend () const” kifejezés kerül végrehajtásra."Vegye figyelembe a következő kódszegmenst:
const vektorvektor
cout << *rIter << '\n';
A kimenet 0.
Ne feledje, hogy a const_reverse_iterator-t ezúttal a fordított_iterator helyett használták a visszaadott iterátor fogadására.
Vektor módosítók
A vektort módosító módosító iterátort vehet fel vagy adhat vissza.
a.munkahely (p, arg)
Beszúr egy T típusú objektumot, amely az std :: forward paranccsal készült
beszúrás (iteratorPosition, érték)
Beszúrja az érték egy példányát a vektor iterátor pozíciójába. Visszaadja az iterátort (pozíciót) abban a vektorban, ahová a másolatot helyezték. A következő kód megmutatja, hogy az érték hova került:
vektorvektor
++iter;
++iter;
vtr.betét (iter, 25);
cout << vtr[1] << " << vtr[2]<< '
" << vtr[3] << '\n';
A kimenet: 20 25 30.
Ne feledje, hogy az iterátor fejlett volt (növekményes), mint egy mutató.
Inicializáló lista is beilleszthető, mivel a következő kód szemlélteti:
vektorvektor
++iter;
++iter;
vtr.beszúrás (iter, 25, 28);
cout << vtr[1] << " << vtr[2]<< '
" << vtr[3]<< " << vtr[4] << '\n';
A kimenet: 20 25 28 30.
törlés (pozíció)
Eltávolít egy elemet az iterátor által mutatott helyzetben, majd visszaadja az iterátor pozícióját. A következő kód ezt szemlélteti:
vektorvektor
++iter;
++iter;
vtr.törlés (iter);
cout << vtr[0] << " << vtr[1] << '
" << vtr[2]<< '\n';
A kimenet: 10 20 40
push_back (t), push_back (rv)
Egyetlen elem hozzáadására szolgál a vektor végén. Használja a push_back (t) elemet az alábbiak szerint:
vektorvtr.visszalépés (5.5);
úszó fl = vtr [4];
cout << fl << '\n';
A kimenet 5.5.
push_back (rv): - lásd később.pop_back ()
Eltávolítja az utolsó elemet anélkül, hogy visszaküldené. A vektor méretét 1-gyel csökkentjük. A következő kód ezt szemlélteti:
vektorvtr.pop_back ();
úszó sz = vtr.méret();
cout << sz << '\n';
A kimenet 3.
a.csere (b)
Két vektor felcserélhető, amint azt a következő kódszegmens szemlélteti:
vektorvektor
vtr1.csere (vtr2);
cout << "vtr1: "<< vtr1[0] <<" "<< vtr1[1] <<"
"<< vtr1[2] <<" "<< vtr1[3] << '\n';
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
A kimenet:
vtr1: 10 20 0 0vtr2: 1.1 2.2 3.3 4.4
Ne feledje, hogy a vektor hossza megnő, ha szükséges. Ezenkívül azokat az értékeket, amelyek nem voltak helyettesítők, valamilyen alapértelmezett érték váltja fel.
egyértelmű()
Eltávolít minden elemet a vektorból, ahogy a következő kódszegmens szemlélteti:
vektorvtr.egyértelmű();
cout << vtr.size() << '\n';
A kimenet 0.
Egyenlőség és kapcsolati operátorok a vektorok számára
A == Operátor
1 értéket ad vissza true értékre, ha a két vektor azonos méretű és a megfelelő elemek egyenlőek; ellenkező esetben 0-t ad vissza hamis értékre. Például:
vektorvektor
bool bl = U == V;
cout << bl << '\n';
A kimenet 0.
A != Operátor
1 értéket ad vissza true értékre, ha a két vektor nem azonos méretű és / vagy a megfelelő elemek nem egyenlőek; ellenkező esetben 0-t ad vissza hamis értékre. Például:
vektorvektor
bool bl = U!= V;
cout << bl << '\n';
A kimenet 1.
A < Operator
1 értéket ad vissza true értékre, ha az első vektor a második vektor kezdeti részhalmaza, a két egyenlő rész elemei azonosak és ugyanabban a sorrendben. Ha mindkét vektor azonos méretű és balról jobbra mozog, és az első vektorban olyan elem találkozik, amely kisebb, mint a második vektor megfelelő eleme, akkor az 1 akkor is visszatér. Ellenkező esetben a hamis 0 értéket adja vissza. Például:
vektorvektor
bool bl = U
A kimenet 1. < does not include the case when the size and order are the same.
Az> Operátor
Visszatér !(U < V), where U is the first vector and V is the second vector, according to the above definitions.
A <= Operator
Visszaadja U-t <= V, where U is the first vector and V is the second vector, according to the above definitions.
A> = Operátor
Visszatér !(U <= V), where U is the first vector and V is the second vector, according to the above definitions.
Következtetés
A vektor egy példa egy szekvenciatartályra. A vektor a közönséges tömb „jobb” formája, és egy osztályból példányos. A vektoroknak módszerei vannak, amelyek a következők szerint vannak besorolva: felépítés és hozzárendelés, kapacitás, elemhez való hozzáférés, adatelérés, iterátorok, módosítók és numerikusan túlterhelt operátorok.
Vannak más szekvenciatárolók is, úgynevezett list, forward_list és tömb. Ha a feladat gyakori beillesztéseket és törléseket tartalmaz a sorozat közepén, akkor egy listát vagy előre_listát kell használni. Ha a feladat gyakori beillesztéseket és törléseket tartalmaz a sorozat elején vagy végén, akkor deque-ot kell használni. Ezért a vektorokat csak akkor szabad használni, ha az ilyen típusú műveletek nem fontosak.