Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Librarie <vector>  (Citit de 1991 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
TwistedFaith
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 8



Vezi Profilul
« : Februarie 14, 2013, 11:51:57 »

Imi poate explica si mie ce fac instructiunile de push_back si pop_back, cum poti folosi un vector ca matrice, "vector <int> A[10]" A
Memorat
fdproxy
Strain
*

Karma: 10
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #1 : Februarie 14, 2013, 12:31:59 »

push_back adauga un element la sfarsitul vectorului.
pop_back sterge elementul de la sfarsitul vectorului.

Implementarea unei matrici depinde de aplicatie. Cea mai facila, probabil, este "vector de vector": std::vector< std::vector< T > >.


Succes.

P.S. "Librarie" este traducerea gresita a cuvantului "library". E ca si cum traducerea cuvantului romanesc "biblioteca", in engleza, ar fi "baiblotec".
Memorat
soriyn
Vorbaret
****

Karma: 24
Deconectat Deconectat

Mesaje: 150



Vezi Profilul
« Răspunde #2 : Februarie 14, 2013, 17:30:48 »

Ca o completare..

push_back(x) adauga elementul x la sfarsitul vectorului si creste dimensiunea vectorului cu 1
pop_back() sterge elementul de la sfarsitul vectorului si scade dimensiunea vectorului cu 1
O alta functie utila, presupunand ca ai un vector a, este a.size() care iti returneaza numarul de elemente ale vectorului a

Se declara exact cum ai spus tu acolo vector<int> a[10]. Acel 10 reprezinta numarul de noduri.

Cod:
 
a[x].push_back(y);              //inseamna ca adaug nodul y la lista de vecini a nodului x
for(int i=0;i<a[x].size();i++)  //parcurg lista de vecini a nodului x in care se afla a[x].size() noduri
 int vecin=a[x][i];               // al i+1- lea nod din lista de vecini a lui x     

 Accesarea e la fel ca la matrice dar ai grija ca indexarea se face de la 0. Adica primul nod din lista de vecini a nodului x este A[ x ][0] al doilea A[ x ][1] si asa mai departe. Elementul A[ x ][z] exista doar daca ai facut z+1 operatii push_back(). Cu alte cuvinte, desi poti simula si in felul asta o matrice, ai grija sa nu accesezi elemente inexistente altfel s-ar putea sa iei KBS.
Memorat
TwistedFaith
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 8



Vezi Profilul
« Răspunde #3 : Februarie 14, 2013, 21:04:56 »

Am reusit sa imi dau seama cum functioneaza (cred) mai devreme, ultima data ma dadusem batut. Problema e ca dupa ce faci prima operatie de push_back, de exemplu: A.push_back(55) dupa ce dai cout<<A[0] iti afiseaza 55, dar in acelas timp se "declara" alte ~2000 elemente (cred ca 2083 daca cumva e constant) adica poti da cout<<A[2000] si iti va aparea un numar intamplator ca si cand ai declara in functie int B si dupa cout<<B;

Daca dai A.pop_back() el distruge conexiunea (ca la liste), prin A.back() nu mai poti lua elementul, dar el pastreaza valoarea, cout<<A[0] este tot 55.

Normal ar fi sa mai apara doar 1 singura casuta, nu sa declare alte 2000, sau astea nu afecteaza timpul de rulare?

---
LE: Multumesc pentru raspunsuri.
« Ultima modificare: Februarie 14, 2013, 21:42:57 de către Stanescu Jean Alexandru » Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #4 : Februarie 14, 2013, 21:10:25 »

Pai din cate stiu eu, daca dai pop_back, se modifica size-ul vectorului, nu are importanta ca ramane V[X], chiar daca V.size () < X. Oricum, faza cu V[2000] merge din coincidenta, cum merge si la int A[15] A[-1], care in mod normal n-ar trebui. El acceseaza aiurea o locatie de memorie si pune o valoare aiurea, cum face int a declarat in interiorul unei functii, neinitializata, pe care o afisezi ulterior. Chestiile astea chiar nu conteaza, si nu afecteaza timpul de executie Smile.
Memorat
fdproxy
Strain
*

Karma: 10
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #5 : Februarie 14, 2013, 23:05:41 »

@TwistedFaith

Banuiesc ca nelamuririle vin de la neintelegerea diferentelor dintre vectorii statici si cei dinamici. push_back anexeza un element la elementele deja existente, lucru ce nu poate fi facut cu un vector static, a carui dimensiune este fixa.

De exemplu:
 std::vector< int > v; // declara un vector de lungime zero (nu contine niciun element)
  v.push_back( 100 ); // elementul 100 a fost adaugat la sfarsitul vectorului; lungimea este 1
  v.push_back( 200 ); // lungimea este 2, iar continutul vectorului este: 100, 200
  int t = v.back(); // t este 200
  v.pop_back(); // lungimea este 1 (200 a fost scos din vector)
  v[ 1 ] = 1; // eroare ce va fi semnalata la rularea cu informatii de depanare (dimensiunea vectorului este 1, deci indexul maxim este 0)
  v[ 10 ] = 10; // la fel ca mai sus


Daca se foloseste un vector static:
 #define VMAX 10
  int v[VMAX]; // declara un vector de dimensiune 10; vectorul contine 10 elemente, deja
  int s = 0; // “dimensiunea” initiala a vectorului
  v[s++] = 100;
  v[s++] = 200;
  int t = v[s-1];
  --s;
  v[1] = 1; // eroare logica; nu va fi semnalata (nici macar in modul “debug”)
  v[10] = 10; // eroare logica; multe compilatoare nu sesizeaza depasirea limitei; eroare poate trece nedetectata la rulare (chiar si in modul “debug”)

  
  
« Ultima modificare: Februarie 14, 2013, 23:29:59 de către fdproxy » Memorat
TwistedFaith
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 8



Vezi Profilul
« Răspunde #6 : Februarie 15, 2013, 14:11:43 »

 v[1] = 1; // eroare logica; nu va fi semnalata (nici macar in modul “debug”)
  v[10] = 10; // eroare logica; multe compilatoare nu sesizeaza depasirea limitei; eroare poate trece nedetectata la rulare (chiar si in modul “debug”)

De ce e eroare logica v[1] = 1? int v[10] ar insemna ca indexul maxim e 9, ok.
Memorat
fdproxy
Strain
*

Karma: 10
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #7 : Februarie 15, 2013, 14:45:38 »

De ce e eroare logica v[1] = 1? int v[10] ar insemna ca indexul maxim e 9, ok.

VMAX (10) este dimensiunea vectorului static (indexul-fizic corect este de la 0 la 9). Din tot vectorul, exemplul foloseste doar primele s elemente. La acel moment s este 1, deci domeniul valid de indecsi-logici este de la 0 la 0 (de la 1 pina la 9 sunt valori ce nu sunt intializate sau nu mai sunt valide in acel punct). Programul nu o sa "crape" (in jargon) dar e posibil sa se comporte anormal, si se poate termina anormal din cauze indirecte. Nu o sa crape in mod direct pentru ca locatia in care scrii este valida (asa cum ai observat, lungimea-fizica a vectorului este 10 iar indexul 1 este in domeniu).

Daca indexul este in afara domeniului-fizic (0-9) atunci scrierea poate avea loc intr-o locatie care nu-i pe placul compilatorului si aplicatia poate crapa fara vreun avertisment.

In aplicatiile comerciale vectorii statici sunt rar utilizati. De cele mai multe ori dimensiunile depind de datele introduse de utilizator, asadar ai nevoie de un vector cu lungime ajustabila dinamic.

Memorat
TwistedFaith
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 8



Vezi Profilul
« Răspunde #8 : Februarie 15, 2013, 15:53:12 »

Practic ce spui tu e ca intr-un vector daca dai o valoare de 2 ori aceluias element este eroare logica... v[1] este 200, de ce nu poti sa ii dai valoarea 1 prin v[1]=1 ? De altfel, ce conteaza cat e s, e doar o valoare care te ajuta sa declari, putea la fel de bine sa puna v[0]=100 si v[1]=200.
Memorat
fdproxy
Strain
*

Karma: 10
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #9 : Februarie 15, 2013, 16:16:51 »

Exemplul 2 emuleaza exemplul 1, ca sa scoata in evidenta diferentele intre cele doua abordari.

s este lungimea curenta a vectorului, chiar daca prin declaratia v[VMAX] se aloca 10 elemente. Folosirea oricarui index in afara domeniului [0, s-1] este eronata.

Lungimea fizica a vectorului v[VMAX] este VMAX (chiar daca s capata valoarea VMAX + 10, de exemplu). Lungimea vectorului std::vector< int > v poate fi ajustata dinamic: poate fi zero, 10 sau cat decizi in momentul in care-l folosesti, spre deosebire de abordarea statica in care lungimea nu poate depasi VMAX.
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines