Автор Тема: struct S { ... }; vector<S> .....  (Прочетена 1519 пъти)

JOKe

  • Напреднали
  • *****
  • Публикации: 537
    • Профил
struct S { ... }; vector<S> .....
« -: 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() '<img'> triia da mu okaja za element1 ili element2 da pusne .. ta kak stava tova ?!
izobshto kak sedqt neshtata ako vektora e ot tip struktura
Активен

" May The Source Be With You . "

savel

  • Напреднали
  • *****
  • Публикации: 52
    • Профил
struct S { ... }; vector<S> .....
« Отговор #1 -: Apr 30, 2004, 03:14 »
колега колега пак си блял на лекции '<img'>

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

Примерен код

#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, т.е. може да има конструктор '<img'>
а във вектора виждаш как се адресира елемент , може и с [] но така няма boundary check...

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

vesok

  • Напреднали
  • *****
  • Публикации: 39
    • Профил
struct S { ... }; vector<S> .....
« Отговор #2 -: 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.
Активен

JOKe

  • Напреднали
  • *****
  • Публикации: 537
    • Профил
struct S { ... }; vector<S> .....
« Отговор #3 -: Apr 30, 2004, 14:31 »
10x mnogo '<img'> znam za list samo che men mi triabva byrzo obhojdane v sluchaq za tova se biah sprial na std::vector '<img'> 10x mnogo za pomoshta
Активен

" May The Source Be With You . "

savel

  • Напреднали
  • *****
  • Публикации: 52
    • Профил
struct S { ... }; vector<S> .....
« Отговор #4 -: 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 '<img'>
Активен

vesok

  • Напреднали
  • *****
  • Публикации: 39
    • Профил
struct S { ... }; vector<S> .....
« Отговор #5 -: May 01, 2004, 08:42 »
>vesok mislq 4e samo za vtoria mem leak si prav

Така е. Sorry ;-)
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Българизиране на Vector ???
Настройка на програми
turist 1 748 Последна публикация May 12, 2004, 09:01
от PAIN1
Vector Linux
Настройка на хардуер
Karajata 10 3554 Последна публикация Jan 06, 2005, 22:54
от Karajata
Vector
Настройка на програми
fogata 4 953 Последна публикация Mar 27, 2005, 21:44
от fogata
Помощ за Vector Linux
Настройка на програми
Ivanov 2 2404 Последна публикация Jul 23, 2012, 15:53
от crystalwater
Проблем с "struct cdev" и "struct semaphore"
Общ форум
halturata 22 13272 Последна публикация Aug 14, 2007, 17:31
от tarator