- algorithm[meta header]
- std::ranges[meta namespace]
- function template[meta id-type]
- cpp20[meta cpp]
namespace std::ranges {
template <random_access_iterator I,
sentinel_for<I> S,
class Comp = ranges::less,
class Proj = identity>
requires sortable<I, Comp, Proj>
constexpr I
sort(I first,
S last,
Comp comp = {},
Proj proj = {}); // (1) C++20
template <random_access_range R,
class Comp = ranges::less,
class Proj = identity>
requires sortable<iterator_t<R>, Comp, Proj>
constexpr borrowed_iterator_t<R>
sort(R&& r,
Comp comp = {},
Proj proj = {}); // (2) C++20
}
- random_access_iterator[link /reference/iterator/random_access_iterator.md]
- sentinel_for[link /reference/iterator/sentinel_for.md]
- ranges::less[link /reference/functional/ranges_less.md]
- identity[link /reference/functional/identity.md]
- sortable[link /reference/iterator/sortable.md]
- random_access_range[link /reference/ranges/random_access_range.md]
- iterator_t[link /reference/ranges/iterator_t.md]
- borrowed_iterator_t[link /reference/ranges/borrowed_iterator_t.md]
範囲を並べ替える
- (1): イテレータ範囲を指定する
- (2): Rangeを直接指定する
[first,last)
の範囲をソートする
last
- O(N log N) (N ==
last - first
) 回の比較
- この関数には、特定のアルゴリズムで実装すべきという規定はない
- 実装のアルゴリズムとしては、クイックソートの改良版であるイントロソートが使われることが多い
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> v = {3, 1, 4, 2, 5};
// 昇順に並べ替える
std::ranges::sort(v);
for (int i : v) {
std::cout << i;
}
std::cout << std::endl;
// 降順に並べ替える
std::ranges::sort(v, std::ranges::greater());
for (int i : v) {
std::cout << i;
}
std::cout << std::endl;
}
- std::ranges::sort[color ff0000]
12345
54321
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
// 要素がひとつの場合
struct MyInt {
int value;
friend auto operator<=>(const MyInt&, const MyInt&) = default;
};
// 要素が複数の場合
struct Person {
int id;
int age;
std::string name;
friend auto operator<=>(const Person&, const Person&) = default;
};
int main() {
std::vector<MyInt> v1 {
MyInt{3},
MyInt{1},
MyInt{2},
};
std::ranges::sort(v1);
std::vector<Person> v2 {
Person{3, 30, "Carol"},
Person{1, 18, "Alice"},
Person{2, 32, "Bob"},
};
std::ranges::sort(v2);
std::vector<Person> v3 {
Person{3, 30, "Carol"},
Person{1, 18, "Alice"},
Person{2, 32, "Bob"},
};
// 特定のメンバでソート
std::ranges::sort(v3, {}, &Person::age);
for (const MyInt& x : v1) {
std::cout << x.value << std::endl;
}
std::cout << std::endl;
for (const Person& x : v2) {
std::cout << x.name << std::endl;
}
std::cout << std::endl;
for (const Person& x : v3) {
std::cout << x.name << std::endl;
}
}
- std::ranges::sort[color ff0000]
1
2
3
Alice
Bob
Carol
Alice
Carol
Bob
- C++20
- Clang: ??
- GCC: 10.1.0 [mark verified]
- ICC: ??
- Visual C++: 2019 Update 10 [mark verified]