記事のディレクトリ
0一般的に使用されるソートアルゴリズムの概要[sort、random_shuffle、merge、reverse]
アルゴリズムの紹介::
sort
コンテナ要素を並べ替えます。
random_shuffle
:指定された範囲のコンテナ要素の場合順不同、つまり、シャッフルします。
merge
:マージ2つのコンテナの要素は、新しいコンテナに格納されます。
reverse
:逆行するコンテナ要素。
1ソート[コンテナ要素をソート]
ロール:コンテナ要素をソートします。
注:
sort
アルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>
。
関数プロトタイプ:
sort(iterator begin, iterator end, _Pred);
パラメータの::
begin
イテレータ開始位置;
end
:イテレータ終了位置;
_Pred
:オプション、デフォルトの昇順ソート;カスタム照合を指定できます。
①通常のコールバック関数;
②述語(戻り値の型がbool
;
③匿名関数(ラムダ式)のファンクター。
④組み込み関数オブジェクト/リレーション関数(bool greater<T>
またはbool less<T>
)。
例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用sort算法
//回调函数
bool myCompare(int val1, int val2) {
return val1 > val2;
}
//函数对象/仿函数
class MyCompare {
public:
//重载函数调用运算符()
bool operator()(int val1, int val2) {
return val1 > val2;
}
};
//sort排序
int main() {
vector<int> v;
v.push_back(9);
v.push_back(1);
v.push_back(7);
v.push_back(6);
v.push_back(3);
//默认升序排序
sort(v.begin(), v.end());
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; }); //1 3 6 7 9
/* 降序排序 */
//1.回调函数实现降序排序
sort(v.begin(), v.end(), myCompare);
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; }); //9 7 6 3 1
//2.仿函数实现降序排序
sort(v.begin(), v.end(), MyCompare());
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; }); //9 7 6 3 1
//3.匿名函数(lambda表达式)实现降序排序
sort(v.begin(), v.end(), [](int val1, int val2) {
return val1 > val2; });
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; }); //9 7 6 3 1
//4.内建函数对象实现降序排序
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; }); //9 7 6 3 1
return 0;
}
2 random_shuffle [シャッフル:指定された範囲内のコンテナ要素をランダムに並べ替えます]
役割:指定された範囲のコンテナ要素に対して順不同、つまり、シャッフルします。
注1:
random_shuffle
アルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>
。
注2:ランダム性を確保するには、ヘッダーファイルをインクルードしinclude <ctime>
、乱数シードを追加する必要がありますsrand((unsigned int)time(NULL));
。
関数プロトタイプ:
random_shuffle(iterator begin, iterator end);
パラメータの説明::イテレータの
begin
開始位置
end
;:イテレータの終了位置;
例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用sort算法
#include <ctime> //添加随机数种子
int main() {
//添加随机数种子
srand((unsigned int)time(NULL));
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
//0 1 2 3 4 5 6 7 8 9
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; });
//洗牌算法
random_shuffle(v.begin(), v.end());
//随机排序:6 9 1 4 3 2 0 5 7 8
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; });
return 0;
}
3マージ【2つのコンテナの要素をマージして新しいコンテナに保存する】
役割:マージ2つのコンテナの要素は、新しいコンテナに格納されます。
注1:
merge
アルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>
。
注2:merge
アルゴリズムを使用する場合、2つのソースコンテナの要素秩序と一貫した秩序でなければなりません、合併後、新しいコンテナ要素は整然としたままです。
注3:merge
アルゴリズムを使用する場合は、ターゲットコンテナである必要があります事前にメモリスペースを開放してください、dest.resize(src1.size() + src2.size());
など。それ以外の場合、実行時にプログラムがクラッシュします。
関数プロトタイプ:
merge(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);
パラメータの::
begin1
ソースコンテナの開始位置1イテレータ;
end1
:1イテレータソースコンテナの終了位置;
begin2
:ソースコンテナの開始位置2イテレータ;
end2
:ソースコンテナの終了位置2イテレータ;
dest
:ターゲットコンテナイテレータ開始位置。
例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用merge算法
int main() {
//合并的两个源容器必须有序,且顺序一致
vector<int> src1;
for (int i = 0; i < 5; i++) {
src1.push_back(i);
}
vector<int> src2;
for (int i = 5; i < 10; i++) {
src2.push_back(i);
}
//合并前,需为目标容器提前分配内存空间
vector<int> dest;
dest.resize(src1.size() + src2.size());
//merge合并
merge(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());
//0 1 2 3 4 5 6 7 8 9
for_each(dest.begin(), dest.end(), [](int val) {
cout << val << " "; });
return 0;
}
4リバース【リバースコンテナエレメント】
役割:逆行する容器元素。
注:
reverse
アルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>
。
関数プロトタイプ:
reverse(iterator begin, iterator end);
パラメータの説明::イテレータの
begin
開始位置
end
;:イテレータの終了位置;
例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用reverse算法
int main() {
vector<int> v;
v.push_back(9);
v.push_back(1);
v.push_back(7);
v.push_back(6);
v.push_back(3);
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; }); //9 1 7 6 3
//反转容器的元素
reverse(v.begin(), v.end());
for_each(v.begin(), v.end(), [](int val) {
cout << val << " "; }); //3 6 7 1 9
return 0;
}