Heim > Backend-Entwicklung > C++ > Hauptteil

Warum ruft „std::sort' für kleine Bereiche nicht immer „std::swap' auf?

Linda Hamilton
Freigeben: 2024-10-29 20:20:03
Original
551 Leute haben es durchsucht

Why Does `std::sort` Not Always Call `std::swap` for Small Ranges?

std::sort ruft nicht immer std::swap auf

In bestimmten Fällen ruft std::sort den benutzerdefinierten Swap möglicherweise nicht auf Funktion, die für einen bestimmten Datentyp definiert ist. Dieses Verhalten wurde in der stdlibc-Implementierung von GCC beobachtet und tritt besonders deutlich bei der Arbeit mit kleinen Elementbereichen auf.

Aus Gründen der Leistungseffizienz verwendet die std::sort-Implementierung von GCC eine Einfügungssortierung für Bereiche unterhalb einer bestimmten Größe. Dies liegt daran, dass die Einfügungssortierung bei kleinen Datensätzen schneller ist als die Schnellsortierung oder die Introsortierung. Allerdings nutzt die Einfügungssortierung nicht die definierte Swap-Funktion. Stattdessen wird eine direkte Verschiebung des gesamten Elementbereichs durchgeführt, um eine schnellere Leistung zu erzielen.

Dieses Verhalten wird im folgenden Codeausschnitt veranschaulicht:

<code class="cpp">#include <algorithm>
#include <iostream>
#include <vector>

namespace my_space
{

struct A
{
    double a;
    double* b;
    bool operator<(const A& rhs) const
    {
        return this->a < rhs.a;
    }
};

void swap(A& lhs, A& rhs)
{
    std::cerr << "My swap.\n";
    std::swap(lhs.a, rhs.a);
    std::swap(lhs.b, rhs.b);
}

}

int main()
{
    const int n = 20;
    std::vector<my_space::A> vec(n);
    for (int i = 0; i < n; ++i) {
        vec[i].a = -i;
    }

    for (int i = 0; i < n; ++i) {
        std::cerr << vec[i].a << " ";
    }
    std::cerr << "\n";
    std::sort(vec.begin(), vec.end());
    for (int i = 0; i < n; ++i) {
        std::cerr << vec[i].a << " ";
    }
    std::cerr << "\n";
}</code>
Nach dem Login kopieren

Wenn n auf 20 eingestellt ist, wird das Die benutzerdefinierte Swap-Funktion wird aufgerufen und das Array wird korrekt sortiert. Wenn n jedoch auf 4 reduziert wird, wird die benutzerdefinierte Swap-Funktion nicht aufgerufen, aber das Array ist immer noch korrekt sortiert.

Dieses Verhalten kann problematisch werden, wenn mit Objekten gearbeitet wird, die teuer zu kopieren sind. Um dieses Problem zu entschärfen, sollten Sie die Verwendung einer Implementierung von std::sort in Betracht ziehen, die immer die bereitgestellte Swap-Funktion aufruft. Darüber hinaus möchten Sie dieses Verhalten möglicherweise den GCC-Entwicklern zur weiteren Optimierung melden.

Das obige ist der detaillierte Inhalt vonWarum ruft „std::sort' für kleine Bereiche nicht immer „std::swap' auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!