Zoeken…


Opmerkingen

De familie std::sort is te vinden in de algorithm .

Sorteervolgordecontainers met gespecificeerde volgorde

Als de waarden in een container bepaalde operators al hebben overbelast, kan std::sort worden gebruikt met gespecialiseerde functors om in oplopende of aflopende volgorde te sorteren:

C ++ 11
#include <vector>
#include <algorithm>
#include <functional>

std::vector<int> v = {5,1,2,4,3};

//sort in ascending order (1,2,3,4,5)
std::sort(v.begin(), v.end(), std::less<int>());

// Or just:
std::sort(v.begin(), v.end());

//sort in descending order (5,4,3,2,1)
std::sort(v.begin(), v.end(), std::greater<int>());

//Or just:
std::sort(v.rbegin(), v.rend());
C ++ 14

In C ++ 14 hoeven we het sjabloonargument voor de vergelijkingsfunctieobjecten niet op te geven en in plaats daarvan het object af te leiden op basis van wat erin wordt doorgegeven:

std::sort(v.begin(), v.end(), std::less<>());     // ascending order
std::sort(v.begin(), v.end(), std::greater<>());  // descending order

Sorteervolgordecontainers op minder overbelaste operator

Als er geen bestelfunctie wordt doorgegeven, std::sort de elementen door operator< aan te roepen op paren van elementen, die een type contextueel converteerbaar naar bool (of alleen bool ) moeten retourneren. Basistypes (gehele getallen, drijvers, aanwijzers, enz.) Hebben al vergelijkingsoperatoren ingebouwd.

We kunnen deze operator overbelasten om de standaard sort te laten werken op door de gebruiker gedefinieerde typen.

// Include sequence containers
#include <vector>
#include <deque>
#include <list>

// Insert sorting algorithm
#include <algorithm>    

class Base {
 public:

    // Constructor that set variable to the value of v
    Base(int v): variable(v) {
    }
    
    // Use variable to provide total order operator less
    //`this` always represents the left-hand side of the compare.
    bool operator<(const Base &b) const { 
        return this->variable < b.variable;
    }
    
    int variable;
};

int main() {
    std::vector <Base> vector;
    std::deque <Base> deque;
    std::list <Base> list;
    
    // Create 2 elements to sort
    Base a(10);
    Base b(5);
    
    // Insert them into backs of containers
    vector.push_back(a);
    vector.push_back(b);
    
    deque.push_back(a);
    deque.push_back(b);
    
    list.push_back(a);
    list.push_back(b);
    
    // Now sort data using operator<(const Base &b) function
    std::sort(vector.begin(), vector.end());
    std::sort(deque.begin(), deque.end());
    // List must be sorted differently due to its design
    list.sort();

    return 0;
}

Volgordecontainers sorteren met behulp van de vergelijkingsfunctie

// Include sequence containers
#include <vector>
#include <deque>
#include <list>

// Insert sorting algorithm
#include <algorithm>

class Base {
 public:

    // Constructor that set variable to the value of v
    Base(int v): variable(v) {
    }
       
    int variable;
};

bool compare(const Base &a, const Base &b) {
    return a.variable < b.variable;
}

int main() {
    std::vector <Base> vector;
    std::deque <Base> deque;
    std::list <Base> list;
    
    // Create 2 elements to sort
    Base a(10);
    Base b(5);
    
    // Insert them into backs of containers
    vector.push_back(a);
    vector.push_back(b);
    
    deque.push_back(a);
    deque.push_back(b);
    
    list.push_back(a);
    list.push_back(b);
    
    // Now sort data using comparing function
    std::sort(vector.begin(), vector.end(), compare);
    std::sort(deque.begin(), deque.end(), compare);
    list.sort(compare);

    return 0;
}

Volgordecontainers sorteren met lambda-expressies (C ++ 11)

C ++ 11
// Include sequence containers
#include <vector>
#include <deque>
#include <list>
#include <array>
#include <forward_list>

// Include sorting algorithm
#include <algorithm>

class Base {
 public:

    // Constructor that set variable to the value of v
    Base(int v): variable(v) {
    }
    
    int variable;
};


int main() {
    // Create 2 elements to sort
    Base a(10);
    Base b(5);
    
    // We're using C++11, so let's use initializer lists to insert items.
    std::vector <Base> vector = {a, b};
    std::deque <Base> deque = {a, b};
    std::list <Base> list = {a, b};
    std::array <Base, 2> array = {a, b};
    std::forward_list<Base> flist = {a, b};
    
    // We can sort data using an inline lambda expression
    std::sort(std::begin(vector), std::end(vector),
      [](const Base &a, const Base &b) { return a.variable < b.variable;});

    // We can also pass a lambda object as the comparator
    // and reuse the lambda multiple times
    auto compare = [](const Base &a, const Base &b) {
                     return a.variable < b.variable;};
    std::sort(std::begin(deque), std::end(deque), compare);
    std::sort(std::begin(array), std::end(array), compare);
    list.sort(compare);
    flist.sort(compare);

    return 0;
}

Sorteer- en volgordecontainers

std::sort , in de standaard bibliotheek header algorithm , is een standaard bibliotheek algoritme voor het sorteren van een reeks waarden, bepaald door een paar van iteratoren. std::sort neemt als laatste parameter een functor die wordt gebruikt om twee waarden te vergelijken; dit is hoe het de volgorde bepaalt. Merk op dat std::sort niet stabiel is .

De vergelijkingsfunctie moet een strikte, zwakke volgorde opleggen aan de elementen. Een eenvoudige minder dan (of groter dan) vergelijking volstaat.

Een container met iterators met willekeurige toegang kan worden gesorteerd met behulp van het std::sort algoritme:

C ++ 11
#include <vector>
#include <algorithm>

std::vector<int> MyVector = {3, 1, 2}

//Default comparison of <
std::sort(MyVector.begin(), MyVector.end());

std::sort vereist dat de iterators random access iterators zijn. De reekscontainers std::list en std::forward_list (vereist C ++ 11) bieden geen iterators voor willekeurige toegang, dus ze kunnen niet worden gebruikt met std::sort . Maar ze hebben wel sort lid functies die een sorteer-algoritme dat werkt met hun eigen soorten iterator te implementeren.

C ++ 11
#include <list>
#include <algorithm>

std::list<int> MyList = {3, 1, 2}

//Default comparison of <
//Whole list only.
MyList.sort();

Hun ledensorteerfuncties sort altijd de hele lijst, dus ze kunnen geen subbereik van elementen sorteren. Aangezien list en forward_list echter snelle forward_list hebben, kunt u de te sorteren elementen uit de lijst halen, sorteren en vervolgens terugplaatsen op de plaats waar ze zo efficiënt waren:

void sort_sublist(std::list<int>& mylist, std::list<int>::const_iterator start, std::list<int>::const_iterator end) {
    //extract and sort half-open sub range denoted by start and end iterator 
    std::list<int> tmp;
    tmp.splice(tmp.begin(), list, start, end);
    tmp.sort();
    //re-insert range at the point we extracted it from
    list.splice(end, tmp);
}

sorteren met std :: map (oplopend en aflopend)

Dit voorbeeld sorteert elementen in oplopende volgorde van een sleutel met behulp van een kaart. Je kunt elk type, inclusief klasse, in plaats van std::string in het onderstaande voorbeeld.

#include <iostream>
#include <utility>
#include <map>

int main()
{
    std::map<double, std::string> sorted_map;
    // Sort the names of the planets according to their size
    sorted_map.insert(std::make_pair(0.3829, "Mercury"));
    sorted_map.insert(std::make_pair(0.9499, "Venus"));
    sorted_map.insert(std::make_pair(1,      "Earth"));
    sorted_map.insert(std::make_pair(0.532,  "Mars"));
    sorted_map.insert(std::make_pair(10.97,  "Jupiter"));
    sorted_map.insert(std::make_pair(9.14,   "Saturn"));
    sorted_map.insert(std::make_pair(3.981,  "Uranus"));
    sorted_map.insert(std::make_pair(3.865,  "Neptune"));

    for (auto const& entry: sorted_map)
    {
        std::cout << entry.second << " (" << entry.first << " of Earth's radius)" << '\n';
    }
}

Output:

Mercury (0.3829 of Earth's radius)
Mars (0.532 of Earth's radius)
Venus (0.9499 of Earth's radius)
Earth (1 of Earth's radius)
Neptune (3.865 of Earth's radius)
Uranus (3.981 of Earth's radius)
Saturn (9.14 of Earth's radius)
Jupiter (10.97 of Earth's radius)

Als invoer met gelijke toetsen mogelijk is, gebruik dan multimap plaats van map (zoals in het volgende voorbeeld).

Om elementen op aflopende wijze te sorteren, declareert u de kaart met een juiste vergelijkingsfunctie ( std::greater<> ):

#include <iostream>
#include <utility>
#include <map>

int main()
{
    std::multimap<int, std::string, std::greater<int>> sorted_map;
    // Sort the names of animals in descending order of the number of legs
    sorted_map.insert(std::make_pair(6,   "bug"));
    sorted_map.insert(std::make_pair(4,   "cat"));
    sorted_map.insert(std::make_pair(100, "centipede"));
    sorted_map.insert(std::make_pair(2,   "chicken"));
    sorted_map.insert(std::make_pair(0,   "fish"));
    sorted_map.insert(std::make_pair(4,   "horse"));
    sorted_map.insert(std::make_pair(8,   "spider"));

    for (auto const& entry: sorted_map)
    {
        std::cout << entry.second << " (has " << entry.first << " legs)" << '\n';
    }
}

uitgang

centipede (has 100 legs)
spider (has 8 legs)
bug (has 6 legs)
cat (has 4 legs)
horse (has 4 legs)
chicken (has 2 legs)
fish (has 0 legs)

Ingebouwde arrays sorteren

De sort algoritme sorteert een volgorde gedefinieerd door twee iterators. Dit is voldoende om een ingebouwde (ook bekend als c-stijl) array te sorteren.

C ++ 11
int arr1[] = {36, 24, 42, 60, 59};

// sort numbers in ascending order
sort(std::begin(arr1), std::end(arr1));

// sort numbers in descending order
sort(std::begin(arr1), std::end(arr1), std::greater<int>());

Vóór C ++ 11 moest het einde van de array worden "berekend" met behulp van de grootte van de array:

C ++ 11
// Use a hard-coded number for array size
sort(arr1, arr1 + 5);

// Alternatively, use an expression
const size_t arr1_size = sizeof(arr1) / sizeof(*arr1);
sort(arr1, arr1 + arr1_size);


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow