vector problem



  • ofstream s("c:\\vec.txt");
    
    	typedef vector<int> TVec;
    	typedef TVec::iterator TIter;
    
    	TVec v;
    
    	v.push_back(1);
    	v.push_back(9);
    	v.push_back(7);
    	v.push_back(5);
    	v.push_back(6);
    	v.push_back(3);
    	v.push_back(8);
    	v.push_back(2);
    
    	for (TIter i = v.begin(); i != v.end(); ++i)
    	{
    		if ((*i) == 5)
    		{
    			i = v.erase(i);
    		}
    	}
    
    	for (TIter j = v.begin(); j != v.end(); ++j)
    	{
    		if ((*j) == 2)
    		{
    			j = v.erase(j);
    		}
    	}
    
    	for (TIter i = v.begin(); i != v.end(); ++i)
    	{
    		s << *i << endl;
    	}
    
    	s.close();
    

    argl warum stürzt das in der 2ten schleife ab?
    es kommt: unhandled exception access violation readiung loaction ... - in dem file MEMCPY.ASM

    kann mir da wer helfen?



  • Weil j möglicherweise auf ein ungültiges Element bzw. auf das Ende hinter dem letzten Element zeigt? Nur so eine Vermutung... 😉 :p

    Vorschlag:

    typedef std::vector<int> Vec;
    typedef Vec::iterator I;
    
    Vec vec;
    //...
    
    I it1 = std::remove(vec.begin(),vec.end(),5);
    I it2 = std::remove(vec.begin(),it1,2);
    
    vec.erase(it2,vec.end());
    


  • Hallo,

    iterator
    erase(iterator position);

    Deletes the vector element pointed to by the iterator position. Returns an iterator pointing to the element following the deleted element, or end() if the deleted element was the last one in this vector.

    Da 2 das letzte Element in dem vector ist wird zeigt i auf end() In der for() Schleife wird i um eins erhöht, zeigt also eins hinter end()

    da i != v.end() ....

    Gruß
    LordX



  • thx! das hab ich nicht bedacht

    habs jetzt so

    TIter it1 = std::remove(v.begin(),v.end(),5);
    	TIter it2 = std::remove(v.begin(),it1,2);
    
    	v.erase(it2,v.end());
    

    jetzt regt sich aber der compiler auf :
    "error C2660: 'remove' : function does not take 3 arguments"

    😞



  • Hast du algorithm includiert?

    mfg
    v R



  • ok nachmals thx !! 😃

    und so gehts übrigens auch

    for (TIter i = v.begin(); (*i) != 5; ++i){}
    	v.erase(i);
    


  • bernhard2004 schrieb:

    und so gehts übrigens auch

    for (TIter i = v.begin(); (*i) != 5; ++i){}
    	v.erase(i);
    

    Ne, erstens: der Code ist nicht standardkonform, denn der Gültigkeitsbereich einer Variable die innerhalb der for-Schleife deklariert wurde, reicht nur bis zum Ende der Anweisung. Zweitens: wenn i auf das Ende zeigt, macht es bang, also unsicher. Drittens: was ist wenn dein vector mehrere Elemente mit dem Wert 5 enhält? 🙄 Viertens: was ist wenn keine? 😉

    Nimm doch lieber remove... 🤡



  • ich will aber nur das erste element das 5 enthält löschen 🕶
    was mach ich dann?



  • Dann reicht auch std::find

    I it = std::find(vec.begin(),vec.end(),5);
    
    if (it != vec.end())
        vec.erase(it);
    


  • ok jetzt bin ich ganz und gar 100% zufrieden 👍



  • Shlo schrieb:

    Dann reicht auch std::find

    I it = std::find(vec.begin(),vec.end(),5);
    
    if (it != vec.end())
        vec.erase(it);
    

    doch noch nicht ganz 😃

    wenn ich jetzt nicht nach einem einfachen int suche sondern zb eine struct speichere im vector, was muss dann der 3te parameter sein? wenn ich zb nach einem struct suchen will in dem val == 4 ist? einfach 4 mitgeben macht keinen sinn, und eine andere struct die ganau so aussieht wie die gesuchte wohl auch eher nicht ... wie würde ich das in dem fall machen?

    typedef struct TMyStruct
    	{
    		int val;
    		CString data;
    	};
    
            typedef vector<TMyStruct> TVec;
    	typedef TVec::iterator TIter;
            TVec v;
    
            ...
    
    	TIter it = std::find(v.begin(),v.end(),  :confused:   );
    	if (it != v.end())
    		v.erase(it);
    

Anmelden zum Antworten