[C++]Vectorをソートして並び替えるには?

C++

どうも、ちょげ(@chogetarou)です。

Vectorをソートして並び替える方法を紹介します。

スポンサーリンク

昇順(小さい順)

Vectorの要素を昇順に並び替えるには、std::sort()を使います。

まず、algorithmをインクルードします。

#include <algorithm>

次に、std::sort()を呼び出します。

std::sort()の第1引数にVectorのイテレータの先頭、第2引数にVectorのイテレータの末尾を指定します。

//myVec=対象のVector
sort(myVec.begin(), myVec.end());

上記のstd::sort()は、Vectorの要素を昇順に並び替えます。

使用例

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void){
    
    vector<int> nums = { 11, 2, 8, 20, 7, 4 };
    
    sort(nums.begin(), nums.end());
    
    for(int item: nums) {
        cout << item << endl;
    }
    
    return 0;
}
出力:
2
4
7
8
11
20
スポンサーリンク

降順(大きい順)

Vectorの要素を降順に並び替えるには、std::sort()を使います。

まず、algorithmをインクルードします。

#include <algorithm>

次に、std::sort()を呼び出します。

std::sort()の第1引数にVectorのイテレータの先頭、第2引数にVectorのイテレータの末尾を指定します。

そして、std::sort()の第3引数にgreater<>()を指定します。

//myVector=対象のVector
std::sort(myVector.begin(), myVector.end(), greater<>());

上記のstd::sort()は、Vectorの要素を降順に並び替えます。

sort()の第3引数に、「第1引数 > 第2引数」を返す関数を指定して、降順に並び替える方法もあります。

sort(myVector.begin(), myVector.end(), [](auto const &i, auto const &j) { return i > j; });

使用例

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void){
    
    vector<int> nums = { 11, 2, 8, 20, 7, 4 };
    
    sort(nums.begin(), nums.end(), greater<>());
    
    for(int item: nums) {
        cout << item << endl;
    }
    
    return 0;
}
出力:
20
11
8
7
4
2
スポンサーリンク

ランダム

Vectorをシャッフルしてランダムに並び替える方法は、3つあります。

for文

1つ目は、for文を使う方法です。

まず、for文でVectorのインデックスを逆順でループします。

ループ処理で、rand()を「ループ変数に1を足した値」で割った余りを取得します。

次に、swap()を呼び出します。

そして、swap()の第1引数に「Vectorのループ変数のインデックスの要素」、第2引数に「Vectorの取得した余りのインデックスの要素」を指定します。

//myVec=対象のVector
int length = size(myVec); //Vectorの要素数を取得
for (int i = length - 1; i >= 0; --i) {
    int j = rand() % (i + 1); //ランダムなインデックスを取得
    swap(myVec[i], myVec[j]); //要素を入れ替える
}

上記のfor文は、Vectorの要素をシャッフルしてランダムに並び替えます。

使用例

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;

int main(void){
    
    vector<string> nums = { "one", "two", "three", "four", "five"};
    
    srand(time(NULL));
    int length = size(nums);
    for (int i = length - 1; i >= 0; --i) {
        int j = rand() % (i + 1);
        swap(nums[i], nums[j]);
    }
    
    
    for(string item: nums) {
        cout << item << endl;
    }
    
    return 0;
}
出力:
three
one
two
five
four

random_shuffle()

2つ目は、ranadom_shuffle()を使う方法です。

まず、algorithmをインクルードします。

#include <algorithm>

次に、random_shuffle()を呼び出します。

そして、random_shuffle()の第1引数にVectorのイテレータの先頭、第2引数にVectorのイテレータの末尾を指定します。

//myVec=対象のVector
random_shuffle(myVec.begin(), myVec.end());

上記のrandom_shuffle()は、Vectorの要素をシャッフルしてランダムに並び替えます。

使用例

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;

int main(void){
    
    vector<string> nums = { "one", "two", "three", "four", "five"};
    
    random_shuffle(nums.begin(), nums.end());
    
    for(string item: nums) {
        cout << item << endl;
    }
    
    return 0;
}
出力:
five
four
two
three
one

shuffle()

3つ目は、shuffle()を使う方法です。

まず、randomをインクルードします。

#include <random>

次に、shuffle()を呼び出します。

shuffle()の第1引数にVectorのイテレータの先頭、第2引数にVectorのイテレータの末尾を指定します。

そして、shuffle()の第3引数にstd::default_random_engine()を指定します。

//myVec=対象のVector
shuffle(myVec.begin(), myVec.end(), default_random_engine());

上記のshuffle()は、Vectorの要素をシャッフルしてランダムに並び替えます。

std::default_random_engine()は、引数にシードを指定できます。

使用例

#include <iostream>
#include <vector>
#include <random>
#include <ctime>
using namespace std;

int main(void){
    
    vector<string> nums = { "one", "two", "three", "four", "five"};
    
   //std::default_random_engine()の引数にシードを設定
    shuffle(nums.begin(), nums.end(), default_random_engine(time(NULL)));
    
    for(string item: nums) {
        cout << item << endl;
    }
    
    return 0;
}
出力:
one
three
five
two
four
スポンサーリンク

まとめ

Vectorの要素を昇順に並び替えるには、std::sort()を使います。

//Vectorを昇順に並び替える
std::sort(myVector.begin(), myVector.end(), greater<>());

Vectorの要素を降順に並び替えるには、std::sort()とgreater<>()を使います。

//Vectorを降順に並び替える
std::sort(myVector.begin(), myVector.end(), greater<>());

Vectorをシャッフルしてランダムに並び替えるには、次の3つの方法を使います。

  • for文を使う方法
  • random_shuffle()を使う方法
    random_shuffle(myVec.begin(), myVec.end());
  • shuffle()を使う方法
    shuffle(myVec.begin(), myVec.end(), default_random_engine());

コメント

タイトルとURLをコピーしました