Die Grosse des Container list



  • Hi,

    bitte um die Antwort auf allgemeine Frage: Wie gross dürfen die Container sein
    (oder wieviele Elemente können sie speichern)?

    Und die zweite Frage: Ist die Methode void unique() für list<> zufährlasig, oder ist es der Algorithmus unique(..) besser?

    Eigentlich habe ich den Containert list<CBeleg> (sizeof(CBeleg) = 128)
    verwendet und die Methode list<CBeleg> Obj.unique() entfernt nicht alle gleiche
    Objekte. sort() funktioniert noch.

    Vermutlich wird der list mehrere Tausend Elemente haben.

    Danke schön



  • die maximale größe findest du mit max_size() heraus:
    http://www.cplusplus.com/reference/stl/list/max_size/

    zu 2) wenn die Methode nciht zuverlässig wäre hätte sie wenig Sinn oder? Du kannst sie getrost benutzen.

    rosic schrieb:

    Eigentlich habe ich den Containert list<CBeleg> (sizeof(CBeleg) = 128)
    verwendet und die Methode list<CBeleg> Obj.unique() entfernt nicht alle gleiche
    Objekte. sort() funktioniert noch.

    Dann wird der Grund ein anderer sein. Zeigst du uns etwas Code?



  • Danke pumuckl (die Größe verursacht das Problem nicht)
    und deswegen etwas des Codes:

    class CBeleg
    {
    private:
    	string KontoNr;
    	CDatum buchungDatum;
    	CDatum valutaDatum;
    	double dBetrag;
    	string strBetrag;
    	string buchungText;
    
    public:
    	CBeleg(){}
    	void setBeleg(char* buffer);
    	const CDatum& get_buchungDatum();
    	string get_buchungText();
    	double anzeigen();
    	void schreiben();
    	friend bool operator <(const CBeleg& BObj1,
    		const CBeleg& BObj2);
    	friend bool operator ==(const CBeleg& BObj1,
    		const CBeleg& BObj2);
    
    };
    ...
    bool operator ==(const CBeleg& BObj1,
    		const CBeleg& BObj2)
    {
    	if ((BObj1.buchungDatum == BObj2.buchungDatum)
    		&& (BObj1.valutaDatum == BObj2.valutaDatum)
    		&& (BObj1.KontoNr == BObj2.KontoNr)
    		&& (BObj1.dBetrag == BObj2.dBetrag)
    		&& (BObj1.buchungText == BObj2.buchungText))
    		return true;
    	else
    		return false;
    
    }
    
    list<CBeleg> CBelegKonto::get_belege()
    {
    	return this->belege;
    }
    void CBelegKonto::set_belege(list<CBeleg>& belege)
    {
    	this->belege = belege;
    }
    ...
    switch(Home.Y) 
    		{
    		case MENU_START_LINE:
    			{
    			neuDateiLesen();
    			alleBelege.set_belege(setAlleBelege());
    			list<CBeleg> belege = alleBelege.get_belege();
    			belege.sort();
    			belege.unique();
    			alleBelege.set_belege(belege);
    			alleBelege_anzeigen(alleBelege);
    			centraleD_neuWrite(alleBelege);			
    			break;
    			}
    

    Ich hab jetzt den Fehler (Ueberweisung != Überweisung) und vorher waren mehrere
    Anweisungen in case: ohne {}

    Trotzdem ist jeder Kommentar des Codes willkommen
    Danke



  • Bite noch eine Frage:

    ich habe kein

    operator=() für
    this->belege = belege;
    

    und trotzdem kein Fehler (????)

    Danke



  • double dBetrag; 
        string strBetrag;
    

    nimm nur double Betrag; und wandel es halt um, wenn du es als string brauchst
    brauchst du es genauer als cent? wenn nicht, würde ich dir raten: nimm int oder long oder so und gib die cent an.

    CBeleg(){}
    

    das ist unnötig - wäre nur nötig, wenn du noch nen anderen konstruktor definiert hättest (was ich übrigens machen würde)

    void setBeleg(char* buffer);
    

    naja - ich würde nicht verstehen, was hier passiert
    char* buffer sieht auch so aus, als ob nen const fehlen würde

    const CDatum& get_buchungDatum();
    	string get_buchungText();
    

    wieso denkst du beim datum daran, es per const ref zu übergeben und beim buchungstext nicht? Oo
    und: "const correctness"

    double anzeigen();
    	void schreiben();
    

    was?

    public:
    	friend bool operator <(const CBeleg& BObj1,
    		const CBeleg& BObj2);
    	friend bool operator ==(const CBeleg& BObj1,
    		const CBeleg& BObj2);
    
    };
    

    hm? 1. wieso friend
    2. wieso machst du op== nicht über !(lhs<rhs) && !(rhs<lhs) ?
    3. wieso brauchst du nen op< ? wie soll man belege ordnen können? nach datum? nach betrag? nach ktonr? würde ich in nen comparer-struct auslagern glaub ich

    bool operator ==(const CBeleg& BObj1,
    		const CBeleg& BObj2)
    {
    	if ((BObj1.buchungDatum == BObj2.buchungDatum)
    		&& (BObj1.valutaDatum == BObj2.valutaDatum)
    		&& (BObj1.KontoNr == BObj2.KontoNr)
    		&& (BObj1.dBetrag == BObj2.dBetrag)
    		&& (BObj1.buchungText == BObj2.buchungText))
    		return true;
    	else
    		return false;
    
    }
    

    ->

    bool foo()
    {
     if(true)
      return true;
     else
      return false;
    }
    

    fällt dir was auf? ^^

    return this->belege;
    

    wieso schreibst du hier das this mit?

    Trotzdem ist jeder Kommentar des Codes willkommen

    ich hoffe, es war nicht so viel, dass du die lust verlierst^^
    kannst dich ja wieder melden, wenn du das so weit gemacht hast und dann kann man ja noch ma drüber gucken und auch noch den rest bemängeln ;o)

    bb

    PS: kopierkonstruktor und zuweisungsoperator werden vom compiler automatisch generiert.
    ist hier auch vollkommen ausreichend, was der tut^^



  • Danke unskilled
    (der Übergang von COBOL(Lebensversicherung) zu OOP braucht noch
    die Arbeit an sich)


Anmelden zum Antworten