C++ Academy · Lektion

Trevägsjämförelseoperatorn i C++20

Använd spaceship-operatorn för kortfattade och konsekventa jämförelser

Lektion 4 av 414 steg

Trevägsjämförelseoperatorn i C++20 är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.

Spaceship-operatorn <=>

C++20 introducerade trevägsjämförelseoperatorn <=>. Med en enda operator får kompilatorn allt den behöver för att generera alla sex relationsoperatorerna.

Returtyper: tre kategorier

Returtypen beror på jämförelsens styrka:

  • std::strong_ordering — ekvivalenta värden som kan särskiljas
  • std::weak_ordering — värden som är ekvivalenta men kan särskiljas (till exempel skiftlägesokänsliga strängar)
  • std::partial_ordering — vissa värden kan inte jämföras (till exempel NaN)

Standardiserad jämförelse

Det vanligaste mönstret är att be kompilatorn generera <=> genom att jämföra medlemmarna lexikografiskt.

struct Point {
    int x;
    int y;
    auto operator<=>(const Point& other) const = default;
};

Point a{1, 2}, b{1, 3};
bool less = (a < b);     // true — auto-generated

Alla sex utan extra arbete

Om ni standardiserar <=> standardiseras även ==. Tillsammans genererar de !=, <, <=, > och >= — alla sex på en enda rad.

Anpassad implementation av <=>

Skriv kroppen manuellt för anpassad jämförelselogik.

std::strong_ordering operator<=>(const Person& other) const {
    if (auto c = name <=> other.name; c != 0) return c;
    return age <=> other.age;
}

Använda resultatet

Resultatet från <=> kan jämföras med det bokstavliga värdet 0 för den booleska kontroll ni faktiskt behöver.

if ((a <=> b) < 0)  std::cout << "a less\n";
if ((a <=> b) == 0) std::cout << "equal\n";
if ((a <=> b) > 0)  std::cout << "a greater\n";

Flyttal och partial_ordering

För flyttal bör ni använda std::partial_ordering för att hantera NaN — en jämförelse med NaN ger unordered.

struct Measurement {
    double value;
    std::partial_ordering operator<=>(const Measurement&) const = default;
};

Exempel på svag ordning

Använd svag ordning när värden kan särskiljas men ändå jämföras som lika — till exempel skiftlägesokänsliga strängar.

Anpassad == separat

Ni kan standardisera <=> och skriva en anpassad == — ibland följer likhet andra regler än ordning.

Migrera äldre kod

Om klassen tidigare hade en mängd jämförelseoperatorer kan ni ersätta dem med en standardiserad <=> när ni migrerar till C++20. Betydligt mindre kod med samma semantik.

När <=> inte bör användas

För typer där endast likhet spelar roll (ingen ordning) bör ni endast tillhandahålla operator== och operator!= (som genereras automatiskt i C++20).

Prestandaanmärkning

Kompilatorn kan optimera en standardiserad <=> lika effektivt som handskrivna jämförelser. Att använda spaceship-operatorn medför ingen extra körtidskostnad.

Snabbkontroll

Vilken returkategori bör en jämförelse använda för flyttalstyper som kan innehålla NaN?

Sammanfattning

C++20-operatorn <=> genererar alla sex relationsoperatorerna från en enda definition. Standardisera den för att jämföra medlemmar lexikografiskt. Välj stark, svag eller partiell ordning utifrån typens semantik.

Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Trevägsjämförelseoperatorn i C++20” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Trevägsjämförelseoperatorn i C++20”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Trevägsjämförelseoperatorn i C++20”?

Använd spaceship-operatorn för kortfattade och konsekventa jämförelser Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C++ Academy?

Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Trevägsjämförelseoperatorn i C++20”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C++ Academy-lektionen?

Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Aritmetiska operatorer och jämförelseoperatorer
  2. Operatorer för ströminmatning och strömutmatning
  3. Indexeringsoperatorn och anropsoperatorn
  4. Trevägsjämförelseoperatorn i C++20
← Tillbaka till C++ Academy