#include <iostream>
#include <forward_list>
using namespace std;
//bool GT5(int x) {
// return x > 5;
//}
class GT5 : public unary_function<int, bool>
{
public:
result_type operator() (argument_type k)
{
return (result_type)(k > 5);
}
};
int main()
{
// 初期状態
forward_list<int> fl1 = { 3, 1, 1, 5, 2, 10, 1, 1, 3, 4, 1, 0, 1};
size_t size = distance(fl1.begin(), fl1.end());
cout << "**初期状態 fl1** size " << size << endl;
for (auto x : fl1)
cout << " " << x;
cout << endl;
// 先頭に要素を追加
cout << "**先頭に要素を追加**\n";
fl1.push_front(0);
// fl1.emplace_front(0);
for (auto x : fl1)
cout << " " << x;
cout << endl;
// 2 番目の要素を削除
cout << "**2 番目の要素を削除**\n";
fl1.erase_after(fl1.begin());
for (auto x : fl1)
cout << " " << x;
cout << endl;
// 値が 0,及び,5 より大きい要素を削除
cout << "**値が 0,及び,5 より大きい要素を削除**\n";
fl1.remove(0);
fl1.remove_if(GT5()); // 単項関数オブジェクト
// fl1.remove_if(GT5); // 関数
// fl1.remove_if([](int x){ return x > 5; }); // ラムダ式
for (auto x : fl1)
cout << " " << x;
cout << endl;
// {4, 5, 6, 7} を要素とする fl2 を生成
cout << "**{4, 5, 6, 7} を要素とする fl2 を生成**\n";
forward_list<int> fl2;
fl2.assign({4, 5, 6, 7});
for (auto x : fl2)
cout << " " << x;
cout << endl;
// fl1 から連続する 1 を削除(sort前)
cout << "**fl1 から連続する 1 を削除(sort前)**\n";
fl1.unique();
for (auto x : fl1)
cout << " " << x;
cout << endl;
// fl1 から連続する 1 を削除(sort後)
cout << "**fl1 から連続する 1 を削除(sort後)**\n";
fl1.sort();
fl1.unique();
for (auto x : fl1)
cout << " " << x;
cout << endl;
// fl1 と fl2 をマージ
cout << "**fl1 と fl2 をマージ**\n";
fl1.merge(fl2);
for (auto x : fl1)
cout << " " << x;
cout << endl;
return 0;
}