Ich konnte nicht verstehen, warum der folgende Code die ersten beiden Elemente des Vektors nicht sortiert:
int main() {
std::vector<int> v = {2,1,3,1,2};
std::sort(v.begin(),v.begin()+1);
for(auto elem:v)
{
std::cout<<elem<<std::endl;
}
// your code goes here
return 0;
}
Irgendwelche Gedanken?
4 Antworten
std::sort
(und alle Standardbibliotheksalgorithmen) erwartet einen halboffenen Bereich. Der Enditerator ist ein One-Past-End-Indikator (der offene Teil). [it, it + 1)
ist also ein Bereich von nur einem Element. In Ihrem Fall ist es nur das erste Vektorelement.
Und nun, ein Ein-Element-Bereich ist bereits sortiert.
Dieser Bereich v.begin(),v.begin()+1
, der mathematisch wie [v.begin(), v.begin() + 1 )
geschrieben werden kann, enthält nur ein Element v[0]
, das 2
entspricht. Wenn Sie einen Bereich von 2 Elementen sortieren möchten, sollten Sie schreiben
std::sort( v.begin(), std::next( v.begin(), 2 ) );
Das ist gleichbedeutend mit
std;:sort( v.begin(), v.begin() + 2 );
Um die ersten n Elemente zu sortieren, müssen Sie angeben, dass Sie wie folgt aufrufen:
sort(V.begin(), V.begin() + n);
Daher müssen Sie für 2 Elemente Folgendes aufrufen:
sort(V.begin(), V.begin() + 2);
Dies liegt daran, dass alle STL-Algorithmen einen offenen Bereich haben [zuerst, zuletzt].
Sorts the elements in the range [first, last)
Von std :: sort
Falls Sie mit der Notation nicht vertraut sind, bedeutet )
, dass last
nicht enthalten ist. Weitere Informationen hierzu finden Sie unter diese Frage.
Verwandte Fragen
Neue Fragen
c++
C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entwickelt und hat eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. Verwenden Sie ein versionsspezifisches Tag für Fragen zu einer bestimmten Standardversion [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] oder [C ++ 23] usw. .