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

C++で構造体をソートする方法:メンバ変数を条件に並べ替えるテクニック

C++では、独自に定義した構造体(struct)でも、適切な比較関数を用意することで簡単に並べ替えができます。この記事では、書籍情報を格納する「book」構造体を例に、タイトル・ページ数・価格という複数のメンバ変数を持つ構造体を、価格(price)を基準に昇順ソートする方法を解説します。

構造体のソートの基本考え方

構造体はintやdoubleのような単純な型ではないため、そのまま比較することはできません。そこで、「2つの構造体をどのように比較するか」を判定する比較関数を自分で定義する必要があります。

この比較関数は、標準ライブラリのstd::sort()関数の第3引数として渡すことで、指定した条件に従って要素を並べ替えられるようになります。比較関数は、第1引数が第2引数より「前に来るべき」場合にtrueを返すように実装します。

サンプルコード

以下の例では、5冊の本の情報を作成し、価格の安い順にソートして表示しています。

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

struct book {
    string title;
    int pages;
    float price;
};

// 価格を基準に昇順で比較する関数
bool compareBook(book b1, book b2) {
    if(b1.price < b2.price) {
        return true;
    }
    return false;
}

main() {
    book book_arr[5];

    book_arr[0].title = "C Programming";
    book_arr[0].pages = 260;
    book_arr[0].price = 450;

    book_arr[1].title = "DBMS Guide";
    book_arr[1].pages = 850;
    book_arr[1].price = 775;

    book_arr[2].title = "Learn C++";
    book_arr[2].pages = 350;
    book_arr[2].price = 520;

    book_arr[3].title = "Data Structures";
    book_arr[3].pages = 380;
    book_arr[3].price = 430;

    book_arr[4].title = "Learn Python";
    book_arr[4].pages = 500;
    book_arr[4].price = 300;

    // 比較関数を渡してソート
    sort(book_arr, book_arr + 5, compareBook);

    for(int i = 0; i<5; i++) {
        cout << book_arr[i].title << "\t\t" << book_arr[i].pages << "\t\t" <<
            book_arr[i].price << endl;
    }
}

実行結果

Learn Python      500     300
Data Structures   380     430
C Programming     260     450
Learn C++         350     520
DBMS Guide        850     775

コードのポイント

  • 比較関数の戻り値:b1.price < b2.priceが成り立つときにtrueを返すため、結果は価格の安い順(昇順)に並びます。降順にしたい場合は不等号を逆にします。
  • sort関数の引数:第1引数と第2引数に配列の先頭と末尾へのポインタを渡し、第3引数に比較関数名を渡します。
  • 応用性:比較関数のロジックを変更すれば、ページ数やタイトルの文字列順など、任意のメンバ変数を基準にソートできます。また、C++11以降ではラムダ式を使ってより簡潔に記述することも可能です。

この手法を覚えておけば、複数のデータをまとめて扱う構造体の配列も、柔軟に並べ替えられるようになります。

  1. 【C++入門】ストリームクラスの階層構造と入出力の基本を徹底解説

    C++におけるストリームとは C++における「ストリーム」とは、プログラムと入出力(I/O)デバイスの間でやり取りされる文字データの流れを指します。 ストリームクラスは、ファイルや入出力デバイスに対する入出力操作を扱うためのクラス群です。それぞれのクラスが固有の役割を持っており、プログラムの入力・出力を効率的に処理できます。 C++のすべてのストリームクラスは、iostreamライブラリにまとめられています。 まずは、ストリームクラスの階層構造を見てみましょう。 iostreamライブラリの主要クラス iosクラス iosクラスは、すべてのストリームクラスの基底クラス(ベースクラス)です。

  2. C++プログラムの基本構造を徹底解説!Hello Worldで学ぶ入門

    C++プログラムの基本構造とは プログラミング言語を効率よく習得する最良の方法は、実際にプログラムを書いてみることです。初心者が最初に書くプログラムとして定番なのが、「Hello World」という文字列を画面に表示するだけのシンプルなプログラムです。ごく簡単な内容ですが、C++プログラムに必要な基本的な構成要素がすべて詰まっています。それでは、さっそくコードを見てみましょう。 #include<iostream> int main() {     std::cout << Hello World\n; } ここからは、このプログ