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?

2
PapaDiHatti 16 Apr. 2018 im 13:53

4 Antworten

Beste Antwort

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.

6
StoryTeller - Unslander Monica 16 Apr. 2018 im 10:56

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 );
2
Vlad from Moscow 16 Apr. 2018 im 10:58

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

1
Eduard Rostomyan 16 Apr. 2018 im 11:00
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.

1
Mansuro 16 Apr. 2018 im 11:22