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



  • 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