- list[meta header]
- std[meta namespace]
- class template[meta id-type]
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から
}
}
- allocator[link /reference/memory/allocator.md]
- polymorphic_allocator[link /reference/memory_resource/polymorphic_allocator.md]
<list>
ヘッダでは、双方向リンクリストの実装である list
コンテナを提供する。
任意の位置への挿入や削除を定数時間で行う事が出来るが、高速なランダムアクセスは出来ず、常にシーケンシャルアクセスを行う必要がある。
テンプレートパラメータは、以下を意味する:
T
: 格納される要素の型、C++17以降は不完全型をサポートしている
Allocator
: メモリ確保に使用されるアロケータの型。デフォルトでは標準のallocator
クラスが使用される。
名前 |
説明 |
対応バージョン |
begin |
先頭要素を指すイテレータを取得する |
|
end |
末尾の次を指すイテレータを取得する |
|
cbegin |
先頭要素を指す読み取り専用イテレータを取得する |
C++11 |
cend |
末尾の次を指す読み取り専用イテレータを取得する |
C++11 |
rbegin |
末尾を指す逆イテレータを取得する |
|
rend |
先頭の前を指す逆イテレータを取得する |
|
crbegin |
末尾を指す読み取り専用逆イテレータを取得する |
C++11 |
crend |
先頭の前を指す読み取り専用逆イテレータを取得する |
C++11 |
名前 |
説明 |
対応バージョン |
front |
先頭要素への参照を取得する |
|
back |
末尾要素への参照を取得する |
|
名前 |
説明 |
対応バージョン |
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> |
|
名前 |
説明 |
対応バージョン |
swap |
2つのlist オブジェクトを入れ替える |
|
名前 |
説明 |
対応バージョン |
erase |
指定した値をもつ要素とその分の領域を、コンテナから削除する |
C++20 |
erase_if |
指定した条件に合致する要素とその分の領域を、コンテナから削除する |
C++20 |
#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 << " ";
});
}
- std::list[color ff0000]
- ls.push_front[link list/push_front.md]
- ls.push_back[link list/push_back.md]
- ls.cbegin()[link list/cbegin.md]
- ls.cend()[link list/cend.md]
不完全型を要素型に出来るようになった事で、階層構造や多分木などの再帰的データ構造を実装することが容易になる。
他にも、vector
とforward_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);
}
- std::list[color ff0000]
- emplace_back[link list/emplace_back.md]
- begin[link list/begin.md]
- end[link list/end.md]
- for[link /lang/cpp11/range_based_for.md]
- std::move[link /reference/utility/move.md]
root
|-sub1
|-sub2
| |-sub2.1
| |-sub2.2
| |-sub2.2.1
|-sub3