forward_list クラスC++11

[機能]

  単方向リストを保持します.なお,以下に示す関数において,一般に,insert_after,push_front よりも,emplace_after,emplace_front を使ったほうが処理効率は良くなります.
template <class T, class Allocator = allocator<T>>
    class forward_list		

[使用方法]
#include <forward_list>
using namespace std;
forward_list<T> 変数名;
   forward_list<int> x;   // 空の forward_list
   forward_list<int> x(3);   // 要素数が 3
   forward_list<int> x(5, 10);   // 5 つの要素を 10 で初期化
   forward_list<int> x(y.it1, y.it2);   // it1 から it2 の範囲で初期化
   forward_list<int> x(y);   // forward_list y で初期化
   forward_list<int> x ({1, 2, 3});   // 初期化子リスト
   forward_list<int> x {1, 2, 3};   // 初期化子リスト
   forward_list<int> x = {1, 2, 3};   // 初期化子リスト		
[メンバー関数等]

[演算子の多重定義]
==  <  <=  !=  >  >=		

[使用例]

  1. forward_list の基本的使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上または下に記述された方法とほぼ同等なものであることを示しています(複数行の対応関係である場合もある).
    #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;
    }
    			
    (出力)
    **初期状態 fl1** size 13
     3 1 1 5 2 10 1 1 3 4 1 0 1
    **先頭に要素を追加**
     0 3 1 1 5 2 10 1 1 3 4 1 0 1
    **2 番目の要素を削除**
     0 1 1 5 2 10 1 1 3 4 1 0 1
    **値が 0,及び,5 より大きい要素を削除**
     1 1 5 2 1 1 3 4 1 1
    **{4, 5, 6, 7} を要素とする fl2 を生成**
     4 5 6 7
    **fl1 から連続する 1 を削除(sort前)**
     1 5 2 1 3 4 1
    **fl1 から連続する 1 を削除(sort後)**
     1 2 3 4 5
    **fl1 と fl2 をマージ**
     1 2 3 4 4 5 5 6 7
    			
[参照]

vectorsetmultimaparraylistmapmultisetpriority_queuequeuestackdequeunordered_mapunordered_multimapunordered_setunordered_multiset

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引