Титла: 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 колега колега пак си блял на лекции
ето ти пример от който би трябвало да разбереш как стаа работата
начи в 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 ;-) |