Ich habe einen Code, der ein seltsames Verhalten zeigt, wenn std :: is_sorted () zweimal hintereinander aufgerufen wird. Das Ergebnis ändert sich! Der Faustanruf gibt false zurück und der zweite Anruf gibt true zurück. Dies geschieht mit der folgenden < /p>
Code: Select all
Apple clang version 15.0.0 (clang-1500.3.9.4)
Code: Select all
Ubuntu clang version 18.1.3 (1ubuntu1)
Beim Kompilieren mit -O2 -std = C ++ 20 . Ich habe auch mit C ++ 11 und c ++ 17 getestet. Der folgende Code verwendet einen Sort -Algorithmus, um ein std :: array zu sortieren und dann zu sehen, dass es std :: is_sorted () ist. Dies ist tatsächlich eine minimale Reproduktion eines Testfalls in einer anderen Codebasis. Ich glaube, der Algorithmus ist korrekt. Wenn ich den Inhalt des Arrays drucke, bevor ich std :: is_sorted () in der erwarteten Reihenfolge und beide Anrufe an std :: is_sorted () true zurückgerechtigt sind. Ich kann dies nicht auf niedrigeren Optimierungsstufen und Gnu G ++ wie erwartet ausgeführt.
Code: Select all
#include
#include
#include
#include
template
void insertion_sort(T begin, T end)
{
T current = begin;
++current;
while(current < end) {
auto key = *current;
auto j = current - 1;
while(j >= begin && *j > key) {
*(j+1) = *j;
--j;
}
*(j+1) = key;
current++;
}
}
int main(int argc, char* argv[])
{
std::array a{5, 2, 4, 6, 1, 3};
insertion_sort(a.begin(), a.end());
std::cout