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

C++ STL の forward_list::unique() 関数の使い方と動作を徹底解説

forward_list::unique() とは

C++ 標準ライブラリに含まれる forward_list::unique() は、forward_list(前方リスト)から重複する要素を削除するためのメンバ関数です。

forward_list はシーケンスコンテナの一種で、コンテナ内の任意の位置に対して定数時間での挿入・削除操作が可能です。内部的には単方向連結リストとして実装されており、各要素が次の要素へのリンクを持つことで順序が維持されます。

unique() を呼び出すと、直前の要素と等しいと判定された要素だけがコンテナから削除されます。つまり、この関数が取り除くのは「隣接する重複」のみであるため、ソート済みのリストに対して特に効果を発揮します。

構文

Forwardlist_name.unique(binary_predicate_name)

二項述語(binary predicate)の構文

bool name(data type a, data type b)

パラメータ − この関数は引数を1つだけ受け取ります。それは二項述語であり、2つの要素を等しいものとして扱うべき場合に true を返す関数オブジェクトです。

実行例

出力 – List : 4, 4, 17, 32, 45, 56, 56, 45, 32, 4, 17, 17
    unique 操作後の出力は以下の通り
        Unique list : 4, 17, 32, 45, 56
出力 – List : 15.2, 74.0, 3.14, 15.2, 69.5, 74.0, 3.14, 18.5, 3.99
    unique 操作後の出力は以下の通り
        Unique list : 3.14, 3.99, 15.2, 18.5, 69.5, 74.0

実装の手順

  • まず、二項述語となる比較関数を作成します。

  • 次に、forward_list を初期化します。

  • 続いて、unique() 関数を呼び出します。

  • 最後に、unique 操作後の forward_list を出力して確認します。

上記の手順に従うことで、forward_list から重複要素を効率的に削除できます。

サンプルコード

// C++ コード:forward_list::unique() の動作を示す例
#include <iostream>
#include <forward_list>
using namespace std;

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

int main(){
    // forward_list の初期化
    forward_list<int> List = { 2, 4, 6, 3, 5, 3, 4, 4, 9, 1, 6, 6, 2, 2, 9 };
    cout << "List の要素:";
    for(auto x = List.begin(); x != List.end(); ++x)
        cout << *x << " ";
    // unique 操作を実行
    List.unique();
    cout << "\nUnique List :";
    for(auto x = List.begin(); x != List.end(); ++x)
        cout << *x << " ";
    return 0;
}

出力結果

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

OUTPUT – List : 2, 4, 6, 3, 5, 4, 4, 9, 1, 6, 6, 2, 2, 9
    Unique List : 1, 2, 3, 4, 5, 6, 9
OUTPUT – List : 15.2, 74.0, 3.14, 15.2, 69.5, 74.0, 3.14, 18.5, 3.99
    Unique List : 3.14, 3.99, 15.2, 18.5, 69.5, 74.0

まとめ

forward_list::unique() は隣接する重複要素のみを削除するため、完全な重複排除を行いたい場合は事前に sort() を呼び出しておくのがポイントです。また、独自の比較条件を使いたい場合は、二項述語を引数として渡すことで柔軟な重複判定が可能になります。

  1. C++ STLのforward_list::cend()関数の使い方を徹底解説

    C++標準テンプレートライブラリ(STL)のforward_list::cend()関数の働きについて解説します。 通常のlistは前後両方向の要素へのリンクを保持しているため双方向の走査が可能ですが、forward_listは次の要素へのリンクのみを保持しており、前方方向にしか走査できません。 forward_list::cend()はC++標準テンプレートライブラリの一部であり、リストの末尾要素の直後(過去末尾)を指す定数イテレータを取得するために使用されます。このイテレータは実際の要素を指すものではなく、走査範囲の終端を示すマーカーとして機能します。 この関数を呼び出すには、<fo

  2. C++STLのforward_list::cbegin()関数の使い方を徹底解説

    この記事では、C++のforward_list::cbegin()関数の動作について詳しく解説します。 forward_listは、通常のlistコンテナと異なり、次の要素へのリンクのみを保持する単方向連結リストです。通常のlistは前後の要素双方とリンクしているため双方向の走査が可能ですが、forward_listは前方方向にしかイテレートできません。その代わり、メモリ消費が抑えられ軽量であるという利点があります。 forward_list::cbegin()関数はC++標準テンプレートライブラリ(STL)の一部であり、リストの最初の要素を指すイテレータを取得するために使用されます。この関数