Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: JOKe в Apr 29, 2004, 15:13



Титла: struct S { ... }; vector<S> .....
Публикувано от: JOKe в Apr 29, 2004, 15:13
ta  1vo vavedenie :
ako imam :
struct neshto {
int element1;
int element2;
};
......
neshto s[10] ;
// tuk sichko e iasno shte imam
s[0].element1 = 3;
s.element2=5;
no ako imam :
struct neshto {
int element1;
int element2;
};
i mesto masiv imam vector ! moje li ? i ako moje kak se obrashtam kam elementite
t.e.
std::vector<neshto> *v= new vector<neshto>(10);
i pri vektor poprincip imame vector.push_back() etc.
no ako imam elementi e iasno che nemoga dan apisha v.push_back() :) triia da mu okaja za element1 ili element2 da pusne .. ta kak stava tova ?!
izobshto kak sedqt neshtata ako vektora e ot tip struktura


Титла: struct S { ... }; vector<S> .....
Публикувано от: savel в Apr 30, 2004, 03:14
колега колега пак си блял на лекции :)

ето ти пример от който би трябвало да разбереш как стаа работата

Примерен код

#include <iostream>
#include <vector>
using namespace std;
struct neshto {
        
        neshto() { elem1=0; elem2=0;}  

        neshto ( int a, int b) {
                            
                elem1 = a;
                elem2 = b;
        }
        
        int elem1;
        int elem2;
};

typedef vector<neshto *> struct_vector;

int main(int argc, char *argv[]) {

    struct_vector vec;
    
    neshto *s = new neshto(5,6);
    cout << "vector is empty = " << vec.empty() << endl;
    vec.push_back(s);
    
    cout << "vector is empty = " << vec.empty() << endl;
    
    cout << vec.at(0)->elem1 << endl;
    cout << vec.at(0)->elem2 << endl;
    
        
}


начи в C++ struct  ти е class с public members, т.е. може да има конструктор :)
а във вектора виждаш как се адресира елемент , може и с [] но така няма boundary check...

самия вектор съдържа само указатели към структура,
typedef vector<neshto *> struct_vector;
ако е
typedef vector<neshto> struct_vector;
ще имаш вектор с копия на структурите... което променя малко примера като например адресираш елементите с "."


Титла: struct S { ... }; vector<S> .....
Публикувано от: vesok в Apr 30, 2004, 13:06
>..mesto masiv imam vector ! moje li ?

Може. При това е по-добре да свикнеш да ползваш вектори или списъци (std::list) отколкото масиви.


>std::vector<neshto> *v= new vector<neshto>(10);

това е вярно но непрактично. Като създаваш вектора така трябва да помниш да го delete-неш. Например savel е забравил да изтрие вектора и ако не беше main а друга функция щеше да си има хубае memory leak. Векторите не са големи структури (всъщност са с размер на 2 указателя и едно цяло число) и е по-добре да се създават като обикновени локални променливи - така те ще се саморазрушат когато не са нужни:

std::vector<neshto>v (10);


това ти създава вектор с 10 елемента които са инициализирани с конструктора по подразбиране. В случая твоята структура няма такъв конструктор така че всичките 10 елемента са неинициализирани. Това (10) ти спестява 10 пъти push_back().


>i ako moje kak se obrashtam kam elementite

Ако си дефинирал:

std::vector<neshto>v (10)

пишеш

v[0].element1 = 3;
v.element2 = 5;
или същото но ще прави проверка дали не си извън вектора:
v.at(0).element1 = 3;
v.at(i).element2 = 5;


--
Ако си дефинирал:

std::vector<neshto *>v (10)

пишеш

v[0]->element1 = 3;
v->element2 = 5;
или същото но ще прави проверка дали не си извън вектора:
v.at(0)->element1 = 3;
v.at(i)->element2 = 5;

--
Ако си дефинирал:

std::vector<neshto> *v = new vector<neshto>(10);

пишеш

(*v)[0].element1 = 3;
(*v).element2 = 5;
или същото но ще прави проверка дали не си извън вектора:
v->at(0).element1 = 3;
v->at(i).element2 = 5;


--
Ако си дефинирал:

std::vector<neshto *> *v = new vector<neshto *>(10);

пишеш

(*v)[0]->element1 = 3;
(*v)->element2 = 5;
или същото но ще прави проверка дали не си извън вектора:
v->at(0)->element1 = 3;
v->at(i)->element2 = 5;


>i pri vektor poprincip imame vector.push_back() etc.

Не е задължително - можеш с конструктора да си укажеш колко е голям вектора и след това просто да го ползваш без push_back(), както е в примерите по-горе.


>no ako imam elementi e iasno che nemoga dan apisha v.push_back()

Грешно. Ти можеж да си имаш елементи и с push_back() да си добавиш още към края. Затова векторите са по-добри от масивите :-)

> triia da mu okaja za element1 ili element2 da pusne .. ta kak stava tova ?!

Този въпрос нещо не го схванах.

> izobshto kak sedqt neshtata ako vektora e ot tip struktura

Нямаш вектор от тип структура, имаш вектор с елементи от тип структура. Надявам се че схващаш разликата.

И още един коментар по повод постинга на savel - почти винаги когато имаш vector<neshto *> е по-добре да ползваш list<neshto> - иначе лесно се забравя че освен да изтриеш елементи от вектора (v.erase()) трябва да изтриеш и самата структура (delete v) - това е и втория memory leak в кода на savel.


Титла: struct S { ... }; vector<S> .....
Публикувано от: JOKe в Apr 30, 2004, 14:31
10x mnogo :) znam za list samo che men mi triabva byrzo obhojdane v sluchaq za tova se biah sprial na std::vector :) 10x mnogo za pomoshta


Титла: struct S { ... }; vector<S> .....
Публикувано от: savel в Apr 30, 2004, 18:32
vesok mislq 4e samo za vtoria mem leak si prav
zashtoto ne pravq

std::vector<neshto> *v= new vector<neshto>(10);

kakto joke e pisal

ina4e za vtoria si abs prav ;)


Титла: struct S { ... }; vector<S> .....
Публикувано от: vesok в May 01, 2004, 08:42
>vesok mislq 4e samo za vtoria mem leak si prav

Така е. Sorry ;-)