C++のSTLには、forward_listという便利なコンテナがあります。
この記事では、forward_listの基本的な使い方から、実際にサンプルコードを交えて詳しく解説していきます。
forward_listとは
forward_listは、C++のSTL(Standard Template Library)に含まれるシンプルなリスト構造のコンテナです。
リスト構造とは、データを順序付けして格納するためのデータ構造であり、forward_listは単方向リストと呼ばれる種類のリストです。
forward_listは、要素を先頭から順番に辿っていくことができますが、逆方向へのアクセスはできません。
そのかわりに、要素の挿入や削除が高速に行えるという特徴があります。
forward_listの基本的な使い方
forward_listの宣言と初期化
forward_listを使用するためには、以下のようにヘッダーファイルをインクルードします。
#include <forward_list>
また、forward_list
はテンプレートクラスであるため、以下のように型名を指定して宣言します。
std::forward_list<int> flist;
上記の例ではint型を要素として持つ空のforward_list
オブジェクトflist
を宣言しています。
また、以下のように初期値を指定して宣言することもできます。
std::forward_list<int> flist = {1, 2, 3};
上記の例では{1, 2, 3}
という初期値を持つint型要素からなるforward_list
オブジェクトflist
を宣言しています。
要素の追加
forward_listに要素を追加する方法はいくつかあります。最も基本的な方法はpush_front()
関数を使用する方法です。この関数は先頭に新しい要素を追加します。
std::forward_list<int> flist = {1, 2, 3};
flist.push_front(10);
上記の例では、先頭に要素を追加することによってflist
の中身が{10, 1, 2, 3}
になります。
また、insert_after()
関数を使用することで任意位置に要素を追加することもできます。この関数は挿入したい位置の直前のイテレーターと挿入したい値を引数に取ります。
#include <iostream>
#include <forward_list>
int main() {
std::forward_list<int> flist = { 1, 2, 4 };
auto it = flist.begin();
it++;
flist.insert_after(it, 30);
for (auto it : flist) {
std::cout << it << std::endl;
}
return 0;
}
1
2
30
4
上記の例では、1番目(先頭は0番目)の要素(2
)の後に30を挿入しています。
要素の削除
erase_after()
関数やremove()
関数等を使用することで、forward_list
から要素を削除することが出来ます。
erase_after()
関数は指定した位置(直前)、もしくは指定子た位置から次の位置まで範囲内にある全ての要素を削除します。
remove()
関数は指定した値に一致する全ての要素を削除します。
#include <iostream>
#include <forward_list>
int main() {
std::forward_list<int> flist = { 1, 2, 3, 4, 5 };
auto it = flist.begin();
it++;
flist.erase_after(it);
//値が4の要素を削除
flist.remove(4);
for (auto it : flist) {
std::cout << it << std::endl;
}
return 0;
}
1
2
5
上記の例ではerase_after()
関数でイテレーターitが示す位置の要素2
が削除され、その後remove()
関数で値が4
の要素がすべて削除されます。
要素検索
find()
関数やcount()
関数等を使用することで、指定した値や条件に一致する要素が存在するかどうか調べることが出来ます。
find()
関数は指定した値に一致する最初(先頭)のイテレーターへポインター変換し返します。
見つからなかった場合はend()
イテレーターへポインター変換し返します。
count()
関数は指定した値に一致する全て(カウント)された回数分だけ整数型変換し返します。
#include <iostream>
#include <forward_list>
int main() {
std::forward_list<int> flist = { 1, 2, 3, 2, 3 };
auto it = std::find(flist.begin(), flist.end(), 3);
if (it != flist.end()) {
std::cout << "3 が見つかりました: " << *it << std::endl;
}
else {
std::cout << "3 が見つかりませんでした" << std::endl;
}
int count_num = std::count(flist.begin(), flist.end(), 2);
std::cout << "2の個数: " << count_num << std::endl;
return 0;
}
3 が見つかりました: 3
Count: 2
上記例ではfind()関数で3
という値が含まれるかどうか調べて、あった場合あ3 が見つかりました
と表示しています。
その後、2
という値が何回含まれているかカウントした結果、2個見つかったのでCount: 2
と表示しています。