最終更新日時(UTC):
が更新

履歴 編集

class template
<list>

std::list

namespace std {
  template <class T, class Allocator = allocator<T> >
  class list;

  namespace pmr {
    template <class T>
      using list = std::list<T, polymorphic_allocator<T>>;  // C++17から
  }
}

概要

listは、双方向リンクリストのデータ構造をもつクラスである。

任意の位置への挿入や削除を定数時間で行う事が出来るが、高速なランダムアクセスは出来ず、常にシーケンシャルアクセスを行う必要がある。

テンプレートパラメータは、以下を意味する:

  • T: 格納される要素の型、C++17以降は不完全型をサポートしている
  • Allocator: メモリ確保に使用されるアロケータの型。デフォルトでは標準のallocatorクラスが使用される。

メンバ関数

構築/コピー/破棄

名前 説明 対応バージョン
(constructor) コンストラクタ
(destructor) デストラクタ
operator= 代入演算子
assign コンテナの再代入

イテレータ

名前 説明 対応バージョン
begin 先頭要素を指すイテレータを取得する
end 末尾の次を指すイテレータを取得する
cbegin 先頭要素を指す読み取り専用イテレータを取得する C++11
cend 末尾の次を指す読み取り専用イテレータを取得する C++11
rbegin 末尾を指す逆イテレータを取得する
rend 先頭の前を指す逆イテレータを取得する
crbegin 末尾を指す読み取り専用逆イテレータを取得する C++11
crend 先頭の前を指す読み取り専用逆イテレータを取得する C++11

領域

名前 説明 対応バージョン
empty コンテナが空かどうかを判定する
size 要素数を取得する
max_size 格納可能な最大の要素数を取得する
resize 要素数を変更する

要素アクセス

名前 説明 対応バージョン
front 先頭要素への参照を取得する
back 末尾要素への参照を取得する

コンテナの変更

名前 説明 対応バージョン
push_front 先頭に要素を追加する
emplace_front 先頭への直接構築による要素追加 C++11
push_back 末尾に要素を追加する
emplace_back 末尾への直接構築による要素追加 C++11
insert 要素の挿入
emplace 要素の直接構築による挿入 C++11
pop_front 先頭から要素を削除
pop_back 末尾から要素を削除
erase 要素の削除
clear 全要素削除
swap コンテナの交換

リスト操作

名前 説明 対応バージョン
splice 他のコンテナから要素を移動する
remove コンテナから指定された値の要素を削除する
remove_if コンテナの条件に合った要素を削除する
unique 重複した要素をコンテナから削除する
merge 2つのコンテナを併合する
sort コンテナを並べ替える
reverse コンテナを反転する

アロケータ

名前 説明 対応バージョン
get_allocator アロケータオブジェクトの取得

メンバ型

名前 説明 対応バージョン
reference value_type&
const_reference const value_type&
iterator 双方向イテレータ
const_iterator 読み取り専用双方向イテレータ
size_type 符号なし整数型(通常はsize_t)
difference_type 符号付き整数型(通常はptrdiff_t)
value_type T
allocator_type Allocator
pointer allocator_traits<Allocator>::pointer
const_pointer allocator_traits<Allocator>::const_pointer
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

非メンバ関数

比較演算子

名前 説明 対応バージョン
operator== 等値比較
operator!= 非等値比較
operator<=> 三方比較 C++20
operator< 左辺が右辺より小さいかの判定を行う
operator<= 左辺が右辺以下かの判定を行う
operator> 左辺が右辺より大きいかの判定を行う
operator>= 左辺が右辺以上かの判定を行う

入れ替え

名前 説明 対応バージョン
swap 2つのlistオブジェクトを入れ替える

要素削除

名前 説明 対応バージョン
erase 指定した値をもつ要素とその分の領域を、コンテナから削除する C++20
erase_if 指定した条件に合致する要素とその分の領域を、コンテナから削除する C++20

推論補助

名前 説明 対応バージョン
(deduction_guide) クラステンプレートの推論補助 C++17

基本的な使い方

#include <iostream>
#include <list>
#include <algorithm>

int main ()
{
  std::list<int> ls;

  // 先頭から要素を追加
  ls.push_front(1);
  ls.push_front(2);

  // 末尾から要素を追加
  ls.push_back(3);
  ls.push_back(4);

  // 要素を先頭から順番に表示
  std::for_each(ls.cbegin(), ls.cend(), [](int x){
    std::cout << x << " ";
  });
}

出力

2 1 3 4 

不完全型を要素にする例 (C++17)

不完全型を要素型に出来るようになった事で、階層構造や多分木などの再帰的データ構造を実装することが容易になる。
他にも、vectorforward_listが不完全型をサポートしている。

#include <iostream>
#include <list>
#include <string>

//簡易なディレクトリ構造表現クラス
class directory {

  //不完全型(クラス定義内ではそのクラス自身は不完全)を要素型に指定
  std::list<directory> m_subdir{};
  std::string m_name{};

public:

  directory(const char* name) : m_name{name}
  {}

  //サブディレクトリ追加
  template<typename Dir>
  void add(Dir&& dir) {
    m_subdir.emplace_back(std::forward<Dir>(dir));
  }

  //ディレクトリ名取得
  auto get() const -> const std::string& {
    return m_name;
  }

  auto begin() const {
    return m_subdir.begin();
  }

  auto end() const {
    return m_subdir.end();
  }
};

//ルートより下のディレクトリについて整形して出力
void recursive_out(const directory& dir, unsigned int depth) {

  if (1 < depth) std::cout << "| ";
  for (auto i = depth; 2 < i; --i) {
    std::cout << " ";
  }
  if (2 < depth) std::cout << " ";

  std::cout << "|-" << dir.get() << std::endl;

  for (auto& subdir : dir) {
    recursive_out(subdir, depth + 1);
  }
}

//ディレクトリ構造を出力する
void out_directorytree(const directory& dir) {
  std::cout << dir.get() << std::endl;

  for (auto& subdir : dir) {
    recursive_out(subdir, 1);
  }
}

int main() {
  directory dir{"root"};
  dir.add("sub1");

  directory sub2{"sub2"};
  sub2.add("sub2.1");

  directory sub22{"sub2.2"};
  sub22.add("sub2.2.1");

  sub2.add(std::move(sub22));

  dir.add(std::move(sub2));
  dir.add("sub3");

  out_directorytree(dir);
}

出力

root
|-sub1
|-sub2
| |-sub2.1
| |-sub2.2
|   |-sub2.2.1
|-sub3

参照