HILFE ich dreh frei 6h verschwendet, STL-Sort-Vector
-
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::sortsortiert [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
akarinö, 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

-
-
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.