HILFE ich dreh frei 6h verschwendet, STL-Sort-Vector



  • Pvt.Frost schrieb:

    ich hab folgendes prob. Ich will zum sortieren des sequenziellen containers vector die sort-Funktion aus der STL nutzen. sort(first,last)
    Problem ist wenn ich das One-Past-The-End-Element(last) von meinem vector übergebe, wird in sort eine expecption ausgelöst 😡 . Ich habe das selbe mit einem int carray getestet --> funktioniert reibungslos. Ich drehe langsam durch 6h schon die selbe scheisse egal was ich versuche. HELP 😕

    Code?



  • akari schrieb:

    Für std::sort muß ja auch der Bereich von ersten bis zum letzten Element angegeben werden, nicht der vom ersten bis zum nächten nach dem letzten.

    std::sort sortiert [first, last**)**.



  • mhh ich will ja net wiedersprechen, aber wieso gebe ich dann bei einem c-array das One-Past-The-End-Element mit und es geht (funktioniert-auch die Sortierung). Und wenn ich es so implementiere wie eben vorgeschlagen wird das letzte Element meines vectors net sortiert 😞

    Edit:
    std::sort sortiert [first, last**)**.[/quote]
    so kenn ich es auch



  • Zeig mal den Code her, bei mir funktioniert das wunderbar.

    @akari: nein, sort arbeitet genauso mit halb offenen Intervallen wie so ziemlich alles andere in der STL.



  • akari schrieb:

    Hallo

    Für std::sort muß ja auch der Bereich von ersten bis zum letzten Element angegeben werden, nicht der vom ersten bis zum nächten nach dem letzten.

    bis bald
    akari

    nö, das "nachste nach dem letzten" ist schon richtig. der fehler wird woanders liegen.



  • beispiel-Code für das Prob

    vector<int> a;
    	for(int i=0; i<10; ++i)
    	{
    		a.push_back(rand());
    		cout<<a.at(i)<<endl;
    	}
    
    	std::sort(&a[0],&a[10]);
    

    Edit:

    nö, das "nachste nach dem letzten" ist schon richtig. der fehler wird woanders liegen.

    ich muss nur wissen wo 😮



  • Versuch mal

    sort(a.begin(), a.end());
    

    edit: 10 wäre sowieso falsch.



  • Dein Code geht erstmal schon davon aus dass ein Iterator als pointer implementiert ist

    std::sort(&a[0],&a[10]);
    

    Der operator[](std::size_t) ist für einen Index >= size() nicht definiert (?)

    Richtig also:

    std::sort(a.begin(),a.end());
    

    Bei einem CArray mag das Funktionieren ... ist aber IMHO auch undefiniert.

    btw.: VC6?



  • mhh aber vector ist wie c-array ein sequenzieller container von daher dürfte das net das prob sein. Bei begin und end war ich schon bei testen.
    Nur nützt mir das leider net weil ich einen Teilstamm sortieren muss zb. die ersten oder letzten 10 elemente. ⚠

    EDIT:

    darthdespotism

    thx for [] tip

    nur wie bekomme ich universeller das OPTEE wie zb im Teilsortierbereich?

    PS: soweit ich weis ist in dem überladenen operator[] keine Index-Überwachung wie in der fkt .at() implementiert. Ich versteh nur net warum nix geht 😡



  • assert(v.size() >= 10);
    
    std::sort(v.begin(), v.begin() + 10);
    
    std::sort(v.rbegin(), v.rbegin() + 10, std::greater<int>());
    

    (ungetestet)



  • Mr. N schrieb:

    assert(v.size() >= 10);
    
    std::sort(v.begin(), v.begin() + 10);
    
    std::sort(v.rbegin(), v.rbegin() + 10, std::greater<int>());
    

    (ungetestet)

    omfg mega thx to mr. n 😃

    ich wusste net das der operator+ für die _Iterator Klasse von vector so überladen ist 😉 du hast jemanden happy gemacht t+7stunden=lösung xD



  • Vielleicht geht zweiteres auch eleganter:

    std::sort(v.end() - 10, v.end());
    


  • Mr. N schrieb:

    Vielleicht geht zweiteres auch eleganter:

    std::sort(v.end() - 10, v.end());
    

    thx _ ist aber in meinem Fall gehupft wie gesprungen. Da der Sortierbereich nach vorn und hinten flexibel seien muss. Das sähe dann so aus

    b=0;
    e=10;
    std::sort(v.begin()+b, v.begin()+e);
    

    thx nochmal mein kopf ist wieder frei 😃 😃



  • Pvt.Frost schrieb:

    PS: soweit ich weis ist in dem überladenen operator[] keine Index-Überwachung wie in der fkt .at() implementiert.

    Das ist nicht definiert. Und dereferenzierender Zugriff auf nicht reservierten Speicher ist *sowieso* nicht reserviert, also ist '&a[10]' auch bei einem C-Array undefiniert, wenn das Array 10 Elemente hat. Die meisten Compiler können's zwar trotzdem, VC 2005 meckert aber z.B. – Stattdessen kann kann auch hier einfach Addition verwenden: '&a[9] + 1'.



  • Konrad Rudolph schrieb:

    also ist '&a[10]' auch bei einem C-Array undefiniert, wenn das Array 10 Elemente hat.

    Das ist genau der springende Punkt. Sowohl für

    int a[10];
    

    als auch für

    std::vector<int> a(10, 0);
    

    resultiert &a[10] in undefiniertem Verhalten, da in beiden Fällen eine Dereferenzierung außerhalb der erlaubten Grenzen stattfindet (zur Erinnerung: im ersten Fall ist a[10] logisch äquivalent zu &*(a+10)).
    Für ein C-Array ist die korrekte Variante: a+10 (allgemein a+offset). Bei einem std::vector baut man entweder auf die Random-Access-Iteratoren (wie hier bereits gezeigt wurde), oder man verwendet &a[0] + offset. Was natürlich voraussetzt, dass a nicht leer ist.


Anmelden zum Antworten