コンテンツにスキップ

C++/標準ライブラリ/forward list

出典: フリー教科書『ウィキブックス(Wikibooks)』

<forward_list> ヘッダーは、単方向リストを提供します。単方向リストは、前の要素へのポインタを持たないため、メモリ使用量が少なくて済む一方で、逆方向への走査ができないという特徴があります。

インクルードディレクティブ
  #include <compare> // see 17.11.1
  #include <initializer_list> // see 17.10.2
名前空間 std の定義
  namespace std {
テンプレートクラス forward_list の定義
  template<class T, class Allocator = allocator<T>> class forward_list;
等価比較演算子
  template<class T, class Allocator>
  bool operator==(const forward_list<T, Allocator>& x, const forward_list<T, Allocator>& y);
3方向比較演算子(宇宙船演算子)
  template<class T, class Allocator>
  synth-three-way-result <T> operator<=>(const forward_list<T, Allocator>& x, const forward_list<T, Allocator>& y);
スワップ関数
  template<class T, class Allocator>
  void swap(forward_list<T, Allocator>& x, forward_list<T, Allocator>& y) noexcept(noexcept(x.swap(y)));
要素削除関数
  template<class T, class Allocator, class U>
  typename forward_list<T, Allocator>::size_type erase(forward_list<T, Allocator>& c, const U& value);

  template<class T, class Allocator, class Predicate>
  typename forward_list<T, Allocator>::size_type erase_if(forward_list<T, Allocator>& c, Predicate pred);
PMR(Polymorphic Memory Resource)サポート
  namespace pmr {
    template<class T>
    using forward_list = std::forward_list<T, polymorphic_allocator<T>>;
  }

コード例

[編集]

以下は、C++のforward_listを使用した簡単なコード例です。この例では、forward_listにいくつかの要素を追加し、それらの要素を出力し、要素の削除と条件付き削除を行います。

#include <forward_list>
#include <iostream>
#include <iterator>

// ヘルパー関数:forward_listの内容を出力する
template <typename T>
void print_forward_list(const std::forward_list<T>& flist) {
    for (const auto& elem : flist) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;
}

auto main() -> int {
    // forward_listの宣言と初期化
    auto flist = std::forward_list{1, 2, 3, 4, 5};

    std::cout << "Initial forward_list: ";
    print_forward_list(flist);

    // 要素の追加
    flist.push_front(0);  // 先頭に0を追加
    std::cout << "After push_front: ";
    print_forward_list(flist);

    // 特定の要素の削除
    flist.remove(3);  // 3を削除
    std::cout << "After remove(3): ";
    print_forward_list(flist);

    // 条件付き削除
    flist.remove_if([](int x) { return x % 2 == 0; });  // 偶数の要素を削除
    std::cout << "After remove_if: ";
    print_forward_list(flist);

    // イテレータを使って要素を追加
    auto it = flist.begin();
    std::advance(it, 1);  // 2番目の位置にイテレータを進める
    flist.insert_after(it, 9);  // 2番目の位置の後に9を追加
    std::cout << "After insert_after: ";
    print_forward_list(flist);

    return 0;
}

コードの説明

[編集]
インクルードディレクティブ
#include <forward_list>: forward_listを使用するためのヘッダー。
#include <iostream>: 標準入出力を扱うヘッダー。
#include <iterator>: イテレータを使用するためのヘッダー。
ヘルパー関数
print_forward_listは、forward_listの要素を順に出力するための関数です。
main関数
std::forward_list<int> flist = {1, 2, 3, 4, 5}; で初期化されたforward_listを宣言。
flist.push_front(0); でリストの先頭に要素0を追加。
flist.remove(3); でリストから要素3を削除。
flist.remove_if([](int x) { return x % 2 == 0; }); でリストから偶数の要素を削除。
auto it = flist.begin(); でイテレータを取得し、std::advance(it, 1); で2番目の位置に進め、flist.insert_after(it, 9); でその位置の後に要素9を追加。

このコード例は、forward_listの基本的な操作(要素の追加、削除、条件付き削除)を示しており、リストのイテレータを用いた操作も含んでいます。