Skoči na vsebino

IPB




Slika

C++ In Vektor


Odgovorov v temi: 21

#1 MaTTo

MaTTo

    Iznajdljivec

  • Members
  • 894 objav
  • Spol:Moški
  • Kraj:Ptuj

Objavljeno 16 april 2012 - 20:16

Pozdravljeni, pri programiranju imam nalogo, ki zahteva uporabo vektorja. Sam dejansko nisem nikoli tega še uporabljal, zato bi rabil slovensko in "kmečko" razlago vektorja ter v čem je uporaben in tako naprej.

Prosim lepo. Hvala! :)

#2 xfirestorm

xfirestorm

    /dev/null

  • Moderators
  • 3 626 objav
  • Spol:Moški
  • Kraj:Murska Sobota
  • Interesi:Airsoft

Objavljeno 16 april 2012 - 22:42

Po kmečko:
Vektorji so polja(array) z dodatno možnostjo spreminjanja velikosti.

Bolj po kmečko verjetno ne bo šlo. :)

Skratka, dokaj neuporabna zadeva(če mene kdo kaj vpraša), čeprav si misliš da če lahko polje inicializiraš majhno in po potrebi kasneje povečaš da prihraniš kaj na spominu, nak. Na žalost zasedejo več spomina kot navadna polja. Plus tega pa "resize" samega vektorja je kar požrešen, tako da če ne gre za razliko med 5 elementi in kasneje možnimi 5miljonov elementov, se verjetno ne splača uporabiti vektorja.

#3 MaTTo

MaTTo

    Iznajdljivec

  • Members
  • 894 objav
  • Spol:Moški
  • Kraj:Ptuj

Objavljeno 17 april 2012 - 11:27

Sem včeraj nekako "pogruntal", kaj bi vektor naj bil. Moja naloga je, da ustvarim razred, kjer imam notri en vektor, v katerega shranjujem objekte drugega razreda. No, zataknilo se mi je, ko bi moral napisato konstruktor za razred, v katerem je vektor, ker nimam pojma, kako ga napisati. Zato ga nisem ter nalogo naredil tako, da sem v glavnem programu preprosto ustvaril en objekt tega razreda ter potem klical metodo.
To zgleda tako:

Skladisce skladisce;
skladisce.dodaj(BLABLA);

Sedaj pa ne vem, če je pravilno tako, ker smo do sedaj imeli vse naloge z razredi, kjer si napisal konstruktor in priredil vrednosti spremenljivkam v razredu ampak tokrat ne vem, kakšne vrednosti bi priredil vektorju.

#4 xfirestorm

xfirestorm

    /dev/null

  • Moderators
  • 3 626 objav
  • Spol:Moški
  • Kraj:Murska Sobota
  • Interesi:Airsoft

Objavljeno 17 april 2012 - 12:15

Inicializacija oz. deklaracija v C++ za vektor ki bo vseboval tip int je takšna:

vector<int> vektor;

To ustvari prazen vektor z velikostjo 0.

vector<int> vektor (4,100);

To pa ustvari vektor z 4 int elementi vrednosti 100.

#5 MaTTo

MaTTo

    Iznajdljivec

  • Members
  • 894 objav
  • Spol:Moški
  • Kraj:Ptuj

Objavljeno 17 april 2012 - 15:12

Že že, ampak nisem mislil tega. Hotel sem vedet, kako ustvarim konstruktor razreda, v katerem je vektor edina spremenljivka.
Recimo za ta razred:

class Skladisce
{
private:
    vector<Oseba> v_oseba;
public:
   //poljubne metode
};


#6 xfirestorm

xfirestorm

    /dev/null

  • Moderators
  • 3 626 objav
  • Spol:Moški
  • Kraj:Murska Sobota
  • Interesi:Airsoft

Objavljeno 17 april 2012 - 17:14

Tak ne deluje?
Imaš include do razreda "Oseba"?

#7 Kevinn Cernic

Kevinn Cernic

    nOObie

  • Members
  • 11 objav

Objavljeno 17 april 2012 - 19:37

MaTTo vidim da si na FERI-ju.... Jaz se naloge lotevam tako, da pač par objektov prej vstavim v vektor in enako kličem metodo dodaj! Ena ideja bi bila, da v glavnem programu ti ustvariš neko polje objektov, ki bi ga potem dodal v konstruktor... vendar je zadeva težja kot se sliši in nikakor ni delovala... Da sem pogruntal nalogo sploh sem najprej podobno nalogo naredil z števili--> torej namesto nekega objekta not vstavim pač neko število... Sedaj ko se pa spravljam delat to z objekti pa mi par stvari ni jasnih!
Kako v metodah ( Skladišče) ti sploh vstaviš nek objekt not-> če vstavljam število je ta zadeva enostavna ... torej bi metoda dodaj zgledala takole..



void Skladisce::dodaj(int stevilo)
{
lista.push_back(stevilo );
}

sedaj me pa zanima kako vstaviti nek objekt, ki je iz razreda Datum, ali pa tudi iz razreda Oseba ?? Jaz sem se loto tega tako, da sem dodal instančno spremenljivko Datum datum.

torej sedaj razred Skladišče zgleda takole:


class Skladisce
{
private:
vector<Datum> lista;
Datum datum;
public:
// neke metode
};

in metoda dodaj potem takole:

void Skladisce::dodaj(Datum datum)
{
lista.push_back(datum);
}
nisem ravno prepričan da je to pravilna rešitev.... kajti sedaj v razredu Skladisce uporabljam vsebovanje... iz razreda Datum..


Prosim za pomoč. Hvala v naprej! :)

#8 denis92

denis92

    Raziskovalec

  • Members
  • 78 objav

Objavljeno 17 april 2012 - 20:13

moja naloga:

  void dodaj(Datum d){
   datumi.push_back(d);
  }
  void brisiX(int i){
   datumi.erase(datumi.begin()+i);
  }
  Datum getX(int i){
   return datumi.at(i);
  }
  int size(){
   return datumi.size();
  }
  vector<Datum> vrniSode()
  {
   vector<Datum> temp;
   for(unsigned int i=0;i < datumi.size(); i+=2)
	temp.push_back(datumi.at(i));
   return temp;
  }
  ~Skladisce()
  {
   datumi.clear();
  }

:)

@kevinn: tiste spremenljivke datum ne rabis

#9 Kevinn Cernic

Kevinn Cernic

    nOObie

  • Members
  • 11 objav

Objavljeno 17 april 2012 - 22:03

Najlepša hvala za tole implementacijo Denis, imaš pijačo v dobrem :)

#10 Matej

Matej

    Pomagač

  • Members
  • 453 objav
  • Spol:Moški

Objavljeno 17 april 2012 - 23:08

Denis, I don't wanna piss all over your parade ampak meni tista vrniSodo metoda meni ne dela pravilno :/

#11 denis92

denis92

    Raziskovalec

  • Members
  • 78 objav

Objavljeno 18 april 2012 - 08:29

Zakaj nebi delala? :) Sprobal je pa sicer res nisem :D ..na zagovoru sem dobo vse pike za to

#12 MaTTo

MaTTo

    Iznajdljivec

  • Members
  • 894 objav
  • Spol:Moški
  • Kraj:Ptuj

Objavljeno 18 april 2012 - 16:12

Hm, jaz sem si to metodo vrniSode zamislo tako, da preveriš, če je ostanek deljenja z 2 enak nič, potem je to število sodo, sicer pa ni.

#13 Kevinn Cernic

Kevinn Cernic

    nOObie

  • Members
  • 11 objav

Objavljeno 18 april 2012 - 17:19

Jaz sem tudi se lotil vrniSode na enak način, torej nekaj takega:


vector<Datum> Skladisce::vrniSode()
{
vector<Datum> nova_lista;
for(int e=0();e<lista.size();e++)
{


if(e%2==0)
{

nova_lista.push_back(lista.at(e));
}
}
return nova_lista;
}

Imam pa težavo, ko hočem v glavnem delu programa izpisat vrnjen vektor, prevajalnik mi ob pregledu ne javi nobene napake... vendar ko se program zažene mi izpiše

Vaja0801.exe has triggered a breakpoint.

Tako izpisujem vektor v glavnem delu programa:

vector<Datum>::iterator j;
for(j=b->vrniSode().begin();j<b->vrniSode().end();j++)
{
j->print();
cout<<endl;

}

Morda ima kdo kakšno idejo zakaj pride do te napake??
:)

#14 MaTTo

MaTTo

    Iznajdljivec

  • Members
  • 894 objav
  • Spol:Moški
  • Kraj:Ptuj

Objavljeno 18 april 2012 - 17:50

Jaz sem to naredil na sledeč način:
rezultat metode vrniSode sem priredil novemu vektorju, ki sem ga ustvaril v glavnem programu. Nato sem si napisal metodo za izpis vektorja, ki kot argument sprejme vektor.
Še koda:


cout << "Testiranje metode vrniSode" << endl;
sklad.dodaj(os1);//znova dodam osebo
sklad.dodaj(os2);//znova dodam osebo
sklad.dodaj(os3);//znova dodam osebo
sklad.dodaj(os4);//znova dodam osebo
cout << "TRENUTNI VEKTOR:" << endl;
sklad.izpisiVector();
cout << "VEKTOR Z SODIMI ELEMENTI: " << endl;
vector<Oseba> temp = sklad.vrniSode();
sklad.izpisiVector(temp);

Ter metoda za izpis vektorja:

void izpisiVector(vector<Oseba> vektor)
{
for(unsigned int i = 0; i < vektor.size(); i++)
{
cout << vektor.at(i).getIme() << " ";
cout << vektor.at(i).getPriimek() << endl;
}
}


#15 denis92

denis92

    Raziskovalec

  • Members
  • 78 objav

Objavljeno 18 april 2012 - 18:01

Ce je treba vrnit soda mesta, zakaj bi preverjal i%2==0 ?? ce pa lahko enostavno za 2 povecujes stevec

#16 Kevinn Cernic

Kevinn Cernic

    nOObie

  • Members
  • 11 objav

Objavljeno 18 april 2012 - 19:04

Hvala MaTTo... sem v glavnem programu prekopiral vrnjen vektor v novega, ter ga enako izpišem in zadeva dela :)

#17 MaTTo

MaTTo

    Iznajdljivec

  • Members
  • 894 objav
  • Spol:Moški
  • Kraj:Ptuj

Objavljeno 18 april 2012 - 19:19

Ce je treba vrnit soda mesta, zakaj bi preverjal i%2==0 ?? ce pa lahko enostavno za 2 povecujes stevec


Verjamem, da dela tudi tako. V bistvu je vseeno, ali pač? Ampak če delaš tako, potem ne smeš vrnit čisto prvega elementa, 0 ni sodo število.


Hvala MaTTo... sem v glavnem programu prekopiral vrnjen vektor v novega, ter ga enako izpišem in zadeva dela :)


Ni problema. :)

#18 denis92

denis92

    Raziskovalec

  • Members
  • 78 objav

Objavljeno 18 april 2012 - 19:28

Da malo zakompliciram :P
ce mas tako: for(int i=0; i < size; i++) if(i%2==0)...
bo enako 0,2,4,6 :) ( 0 / 2 = 0, ostanek 0)
+nepotrebna ponavljanja in primerjanja bojo

ce bi hotel od 2 naprej, pa das i na zacetki na 2 -> for(int i=2; i < size; i+=2)

pa v besedilu naloge pise 0,2,4... (sej mamo isto besedilo?) :D

#19 MaTTo

MaTTo

    Iznajdljivec

  • Members
  • 894 objav
  • Spol:Moški
  • Kraj:Ptuj

Objavljeno 18 april 2012 - 21:07

Da malo zakompliciram :P
ce mas tako: for(int i=0; i < size; i++) if(i%2==0)...
bo enako 0,2,4,6 :) ( 0 / 2 = 0, ostanek 0)
+nepotrebna ponavljanja in primerjanja bojo

ce bi hotel od 2 naprej, pa das i na zacetki na 2 -> for(int i=2; i < size; i+=2)

pa v besedilu naloge pise 0,2,4... (sej mamo isto besedilo?) :D


No ja, v bistvu res piše 0, 2, 4... Sploh nisem opazil :D

#20 Matej

Matej

    Pomagač

  • Members
  • 453 objav
  • Spol:Moški

Objavljeno 18 april 2012 - 22:12

Ampak v navodilu pa piše, da vrača sode ... torej je oboje pravilno :)



Dodaj odgovor



  


0 član(ov) bere to temo

0 članov, 0 gostov, 0 anonimnih uporabnikov