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:
#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());
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)
// 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:
#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.
#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.
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:
// 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);