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

C++ STLのlist::unique()関数でリストから重複要素を削除する方法

この記事では、C++ STLのlistコンテナが提供するunique()関数の機能と使い方について解説します。

STLにおけるlistとは

listは、シーケンス内の任意の位置に対して定数時間O(1)での挿入・削除を可能にするコンテナです。内部的には双方向連結リストとして実装されており、メモリは非連続的に確保されます。そのため、配列やvector、dequeと比べて、コンテナ内の任意の位置への要素の挿入・抽出・移動が高速に行えるという大きな特徴があります。

一方で、先頭や末尾以外の要素への直接アクセス(ランダムアクセス)は遅いという欠点があります。また、listはforward_listとよく似ていますが、forward_listは単方向連結リストであり、前方方向にしか走査できない点が異なります。

unique()関数とは

listのunique()関数は、リストから連続する重複要素を削除するためのメンバ関数です。なお、隣接していない重複要素は削除されないため、リスト全体から重複を完全に取り除きたい場合は、あらかじめsort()でソートしておくのが一般的です。

構文

list_name.unique(binary_predicate_name)

二項述語(binary predicate)の構文

bool name(data_type a, data_type b)

パラメータ

この関数が受け取る引数は1つだけです。それは二項述語と呼ばれる比較用の関数で、「2つの要素を等しいものとして扱うべき場合にtrueを返す」ように定義します。引数を省略した場合はデフォルトの等価比較(operator==)が使われ、値が等しい連続する要素が削除されます。

入出力例

入力: List − 2 2 5 5 6 7 9 9 9 10
出力: 新しいList − 2 5 6 7 9 10

入力: List − 0.45 0.45 3.00 3.14 5.56 7.62 7.62 7.62 9.00 9.00
出力: 新しいList − 0.45 3.00 3.14 5.56 7.62 9.00

処理の手順

  • まず、二項述語となる比較用関数を作成します。
  • 次に、listを初期化します(全ての重複を除去したい場合はソートしておきます)。
  • unique()関数を呼び出します。
  • unique操作後のlistを出力して結果を確認します。

上記の手順に従うことで、リストから重複要素を効率的に取り除くことができます。

サンプルコード1:int型のリストの場合

// C++ STLにおけるlist unique()関数の動作を示すサンプルコード
#include <iostream>
#include <list>
using namespace std;

// 二項述語となる比較関数
bool cmp(int a, int b) {
    return (abs(a) == abs(b));
}

int main() {
    list<int> lst = { 13, 13, 14, 15, 15, 15, 19, 19, 19, 20, 20 };

    // リストの内容を出力
    cout << "Elements in List: ";
    for (auto x = lst.begin(); x != lst.end(); ++x)
        cout << *x << " ";

    // unique()関数を呼び出し
    lst.unique(cmp);

    // unique操作後のリストを出力
    cout << "\nList after unique operation: ";
    for (auto x = lst.begin(); x != lst.end(); ++x)
        cout << *x << " ";

    return 0;
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Elements in List: 13 13 14 15 15 15 19 19 19 20 20
List after unique operation: 13 14 15 19 20

サンプルコード2:float型のリストの場合

// C++ STLにおけるlist unique()関数の動作を示すサンプルコード
#include <iostream>
#include <list>
using namespace std;

// 二項述語となる比較関数
bool cmp(float a, float b) {
    return (abs(a) == abs(b));
}

int main() {
    list<float> lst = { 0.45f, 0.45f, 3.00f, 3.14f, 5.56f,
                        7.62f, 7.62f, 7.62f, 9.00f, 9.00f };

    // リストの内容を出力
    cout << "Elements in List: ";
    for (auto x = lst.begin(); x != lst.end(); ++x)
        cout << *x << " ";

    // unique()関数を呼び出し
    lst.unique(cmp);

    // unique操作後のリストを出力
    cout << "\nList after unique operation: ";
    for (auto x = lst.begin(); x != lst.end(); ++x)
        cout << *x << " ";

    return 0;
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Elements in List: 0.45 0.45 3.00 3.14 5.56 7.62 7.62 7.62 9.00 9.00
List after unique operation: 0.45 3.00 3.14 5.56 7.62 9.00

まとめ

list::unique()は、二項述語を指定することで柔軟な重複判定を実現できる便利な関数です。ただし「連続する重複」のみを削除する仕様である点には注意し、必要に応じて事前にソートしてから使用するとよいでしょう。

  1. C++ STLのlist::reverse()関数の使い方と実例解説

    本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar

  2. C++STLのlist back()関数の使い方を解説

    C++のlist back()関数とは本記事では、C++におけるlist back()関数の動作について詳しく解説します。list::back()関数は、C++標準テンプレートライブラリ(STL)の一部であり、リストの最後(末尾)の要素を取得・表示するために使用されます。この関数を呼び出す前に、必ず<list>ヘッダーファイルをインクルードする必要がある点に注意してください。構文List_Name.back();パラメータこの関数は、いかなるパラメータも受け取りません。戻り値この関数は、リストの最後の要素の値を返します。なお、リストが空の場合の動作は未定義となるため、呼び出し前にリ