webForumDet fria alternativet

ta bort ur vektor

C/C++

9 svar · 414 visningar · startad av Mc Fetto

Medlem sedan nov. 20022 355 inlägg
Frågan#1

JAg har följande while sats där jag vill ta bort ett objekt ut vektorn om det inte stämmer överens med ett vist attribut:

 		while (i<antal)
		{
			if (vektor[i].getObjId()!=oid)
			{
				vektor.erase(vektor.begin()+i);
				antal--;
			}
			i++;
		}

Men det verkar inte fungera riktigt... Är det ngn som ser ngt fel?
i tilldelas 0 innan satsen!

Medlem sedan mars 20034 471 inlägg
#2

Vad är vektor för typ? Är det en array eller använder du STL-klassen Vector?

Medlem sedan nov. 20022 355 inlägg
#3

STL klassen vector använder jag!!
Tror det har ngt med när jag räknar ned antal så kanske den inte räknar hela vägen till slutet... kanske borde prova att räkna ut hur många man tar bort och efter while-satsen ta och räkna ned antal då istället!!

Medlem sedan okt. 20013 217 inlägg
#4

Använd en iterator istället. Då kan du skriva :

while (itr != vektor.end())
{
   if ((*itr).getObjId()!=oid)
   {
       vektor.erase(itr);
       break;
   }
   itr++
}
Medlem sedan nov. 20022 355 inlägg
#5

Ja det kanske är bra, men då blir det fel när jag kör det och VS pekar på denna radden i min klass Bok:

int getObjId() { return LanObj::getObjId(); }

itr skapade jag så här:

vector<Bok>::iterator itr = vektor.begin();

Kanske var fel att skapa itr så?

Medlem sedan juni 200010 432 inlägg
#6

Detta torde fungera bättre:

vector<Bok>::iterator itr,it;
for(it=NULL,itr=vektor.begin();itr<vektor.end();itr++)
   if((*itr).getObjId()!=oid){
      it = itr;
      itr=vektor.end();
}
if(it)
  vektor.erase(it);

Om det nu är första förekomsten av ett icke oid du vill ta bort.

red:
getObjId() skulle det vara

Medlem sedan nov. 20022 355 inlägg
#7

Har jag tolkat din kod fel? Jag får den till att om oid inte är lika med getObjektId så ges itr slutet på vektorn... Meningen med min sats är att den ska ta bort alla böcker som inte stämmer överens!
Möjligt att jag tolkat det helt tokfel ;)

red: läste inte ditt inlägg efter koden :r

Medlem sedan nov. 20022 355 inlägg
#8

Blev en aning bättre nu!

 vector<Bok>::iterator itr,it;
for(it=NULL,itr=vektor.begin();itr<=vektor.end();itr++)
   if((*itr).getObjId()!=oid){
      it = itr;
      vektor.erase(it);
}

Men där ligger fortfarande kvar två Böcker i vektorn... hajar inte riktigt vad det kan vara!

om jag vill ta bort alla utom objekt id 66, så ligger där fortfarande kvar en annan!!

Medlem sedan juni 200010 432 inlägg
#9
vector<Bok>::iterator itr,it;
for(itr=vektor.begin(),it=itr;itr<vektor.end();itr++)
   if((*itr).getObjId()!=oid){
      it = itr;
      vektor.erase(it);
      itr = it-1;
}
Medlem sedan nov. 20022 355 inlägg
#10

Tnx alot :)

267 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)