C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】std::sortで任意のデータ型の配列をソートする方法を解説

整数(int)、浮動小数点数(float)、文字列(string)、真偽値(bool)など、さまざまなデータ型の値が与えられた場合でも、共通の1つの関数を使って任意のデータ型の変数をソートし、その結果を表示したいという場面は多くあります。

C++では、標準テンプレートライブラリ(STL)に用意されている std::sort を使うことで、あらゆる型の配列を簡単にソートできます。デフォルトでは配列の要素が昇順に並べ替えられます。sort() 関数が受け取る主な引数は以下のとおりです。

  • 開始位置: 配列の先頭要素。ソートを開始する場所を指定します。
  • 終了位置: 配列の末尾。ここまでソートが行われます。
  • 比較関数(任意): greater<T>() を渡すことで、デフォルトの昇順から降順に並び順を変更できます。

入出力例

入力:int arr[] = { 2, 1, 5, 4, 6, 3 }
出力:1, 2, 3, 4, 5, 6

入力:float arr[] = { 30.0, 21.1, 29.0, 45.0 }
出力:21.1, 29.0, 30.0, 45.0

入力:string str[] = { "tutorials point is best", "tutorials point", "www.tutorialspoint.com" }
出力:tutorials point  tutorials point is best  www.tutorialspoint.com

プログラムのアプローチ

本記事で紹介するプログラムは、以下の手順で処理を行います。

  • int型、float型、string型など、異なるデータ型の配列を用意する
  • どの型の配列にも対応できる sort() 関数を適用して要素をソートする
  • ソート結果を出力する

アルゴリズム

開始
ステップ1 → さまざまな型のデータを扱うためのテンプレート Template <class T> を作成する
ステップ2 → 任意のデータ型のソート済み配列を表示する関数を作成する
    void print(T arr[], int size)
    ループ:size_t i = 0 から i < size の間 ++i ずつ繰り返す
        arr[i] を出力する
    ループ終了
ステップ3 → main() 内での処理
    配列のサイズを表す変数を宣言:int num = 6
    int型の配列を作成:int arr[num] = { 10, 90, 1, 2, 3 }
    ソート関数を呼び出す:sort(arr, arr + num)
    表示関数を呼び出す:print(arr, num)
    string型の配列を作成:string str[num] = { "tutorials point is best", "tutorials point", "www.tutorialspoint.com" }
    ソート関数を呼び出す:sort(str, str + num)
    表示関数を呼び出す:print(str, num)
    float型の配列を作成:float float_arr[num] = { 32.0, 12.76, 10.00 }
    ソート関数を呼び出す:sort(float_arr, float_arr + num)
    表示関数を呼び出す:print(float_arr, num)
終了

C++による実装例

#include <bits/stdc++.h>
using namespace std;

// テンプレートクラスを使った汎用の表示関数
template <class T>
void print(T arr[], int size) {
    for (size_t i = 0; i < size; ++i)
        cout << arr[i] << "   ";
    cout << endl;
}

int main() {
    int num = 6;

    // int型の配列をソート
    int arr[num] = { 10, 90, 1, 2, 3 };
    sort(arr, arr + num);
    print(arr, num);

    // string型の配列をソート
    string str[num] = { "tutorials point is best", "tutorials point", "www.tutorialspoint.com" };
    sort(str, str + num);
    print(str, num);

    // float型の配列をソート
    float float_arr[num] = { 32.0, 12.76, 10.00 };
    sort(float_arr, float_arr + num);
    print(float_arr, num);

    return 0;
}

出力結果

0   1   2   3   10   90
tutorials point   tutorials point is best   www.tutorialspoint.com
10   12.76   32

このように、template <class T> を使った汎用の表示関数を1つ用意しておけば、データ型ごとに出力関数を個別に作る必要がなく、std::sort と組み合わせるだけで int・float・string などあらゆる型の配列を効率的にソート・表示できます。なお、配列の初期化子の要素数が num より少ない場合、残りの要素はゼロ(または空文字)で初期化されるため、上記の出力のように「0」が先頭に現れる点にも注意してください。

  1. C++でストゥージソートを実装する方法:再帰的ソートアルゴリズムの解説とサンプルコード

    ストゥージソート(Stooge Sort)は、与えられたデータを並べ替えるための再帰的なソートアルゴリズムです。配列をそれぞれ全体の2/3ずつが重なり合う2つの部分に分割し、「前半部分のソート → 後半部分のソート → 再び前半部分のソート」という3段階の手順で整列を行います。このアルゴリズムの最悪計算量は O(n^2.7095) であり、バブルソート(O(n²))よりも遅いという特徴があります。実用性は低いものの、再帰処理やアルゴリズムの学習教材として知られています。アルゴリズムの手順Begin データを入力として受け取る。 データ配列 a と要素数 n を引数として Stoog

  2. C++の変数とは?基本の変数宣言と主なデータ型をわかりやすく解説

    変数(へんすう)とは、プログラムが操作できる「名前付きの記憶領域」のことです。C++では、各変数に必ず特定の「型」が割り当てられます。この型によって、次の3つの要素が決まります。変数のメモリ上のサイズと配置そのメモリに格納できる値の範囲その変数に適用できる演算(操作)の種類最もシンプルな変数の例を見てみましょう。int my_val = 5;この例では、int型(整数型)の変数 my_val を宣言し、値として 5 を代入しています。変数の宣言方法C++で変数を定義する一般的な書式は次のとおりです。type variable_name;宣言と同時に初期化したい場合は、以下のように記述します。t