wie funktioniert operator==() bei std::vector ?



  • Hallo

    ich wollt wissen, ob der operator== alle einträge iteriert und einzeln vergleicht, also sowas:

    DieWerte::const_iterator it = dieWerte.begin();
    for ( it; it != dieWerte.end(); ++it )
    {
      if ( (*it) != (*itandererWert) ) return false;
      ++itandererWert;
    }
    return true;
    

    so in etwa
    oder vergleicht er einfach die grössen von den zwei vektoren ?



  • Hallo,

    wieso den 2 Vektoren? Ich seh in deinem Bsp. nur einen Vektor (ich geh mal davon aus das DieWerte ein Vektor ist).

    Ansonsten geht der Iterator bei deinem Bsp. den kompletten Vektor durch, wenn du einen bestimmten Wert suchst kannste ja auch mit find arbeiten.

    So,entweder ich konnt dir jetzt helfen oder ich hab deine Frage nicht verstanden :p

    MfG

    meissner



  • sry hab wohl blöd formuliert
    ich meinte den std::vector<T>::operator==(), also den operator==() der aus der vector klasse stammt,
    wie vergleicht er? geht er jedes element durch und vergleicht es oder vergleicht der operator nur die grösse von den vectoren ?



  • Der == Operator vergleicht normalerweise inhaltlich, also macht es wohl wenig Sinn, nur die Grösse zu vergleichen, oder?



  • hm
    dereferenziert er, wenn er aus zeigern besteht,
    also wenn man int* oder MyObject* in den vector hineintun,
    vergleich er den inhalt der objecte oder die zeigeradressen ?



  • er sollte eigentlich nur die zeigeraddressen vergleichen, denn wenn 2 zeiger gleich sind, müssten eigentlich auch die zu den zeigern gehörigen objekten gleich sein 🙂



  • es seih den man hat misst gebaut 😃



  • Hallo,

    DEvent schrieb:

    hm
    dereferenziert er, wenn er aus zeigern besteht,
    also wenn man int* oder MyObject* in den vector hineintun,
    vergleich er den inhalt der objecte oder die zeigeradressen ?

    das kann man doch auch ganz leicht selber testen:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
            vector<int*> a;
            vector<int*> b;
    
            int zahl1 = 20;
            int zahl2 = 21;
            int zahl3 = 21;
    
            a.push_back(&zahl1);
            a.push_back(&zahl2);
    
            b.push_back(&zahl1);
            b.push_back(&zahl3);
    
            if(a == b)
                    cout << "gleich" << endl;
    }
    


  • otze schrieb:

    er sollte eigentlich nur die zeigeraddressen vergleichen, denn wenn 2 zeiger gleich sind, müssten eigentlich auch die zu den zeigern gehörigen objekten gleich sein 🙂

    Was aber noch lange nicht bedeutet, dass die Objekte ungleicch sind, wenn die Zeiger ungleich sind. 😉



  • groovemaster schrieb:

    otze schrieb:

    er sollte eigentlich nur die zeigeraddressen vergleichen, denn wenn 2 zeiger gleich sind, müssten eigentlich auch die zu den zeigern gehörigen objekten gleich sein 🙂

    Was aber noch lange nicht bedeutet, dass die Objekte ungleicch sind, wenn die Zeiger ungleich sind. 😉

    ich würde sagen, wenn mans aus dem sichtwinkel der zeiger sieht, dann kann man das nicht so pauschal sagen...
    die objekte können aus zeigersicht nur gleich sein, wenn sie den gleichen speicherbereich besitzen, da es ja noch einen neuen testwert gibt->die position im speicher.



  • Wie soll der std::vector überhaupt so intelligent(?) sein, Zeiger zu "erkennen" und zu dereferenzieren, womöglich auch noch in beliebiger Tiefe (Doppelzeiger, Dreifachzeiger, etc.), hmmm? 🙂



  • Till schrieb:

    Wie soll der std::vector überhaupt so intelligent(?) sein, Zeiger zu "erkennen" und zu dereferenzieren, womöglich auch noch in beliebiger Tiefe (Doppelzeiger, Dreifachzeiger, etc.), hmmm? 🙂

    der std::vector kann das nicht. eine traits enhanced version hingegen schon, und noch um einiges mehr.



  • otze schrieb:

    ich würde sagen, wenn mans aus dem sichtwinkel der zeiger sieht, dann kann man das nicht so pauschal sagen...

    Doch, kann man. Ich zumindest 🤡
    Kleines Beispiel

    class foo
    {
    private:
        int i_;
    public:
        foo(int i)
            : i_(i)
        {
        }
    };
    //...
    foo* a = new foo(10);
    foo* b = new foo(10);
    

    Sind die Adressen der Zeiger a und b gleich?
    Sind die Objekte, die sich hinter a und b verbergen, gleich?


Anmelden zum Antworten