list クラス

[機能]

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

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

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

[使用例]

  1. list の基本的使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上または下に記述された方法とほぼ同等なものであることを示しています(複数行の対応関係である場合もある).
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    //bool is_odd(int x) {
    //	return x % 2 > 0;
    //}
    
    class is_odd : public unary_function<int, bool>
    {
    	public:
    		result_type operator() (argument_type k)
    		{
    			return (result_type)(k % 2);
    		}
    };
    
    void print(string str, list<int> &ls) {
    	if (ls.empty())
    		cout << "  コンテナ " << str << " は空です\n";
    	else {
    		cout << str << " の要素数: " << ls.size() << endl;
    		for (auto x : ls)
    			cout << " " << x;
    //		list<int>::iterator it;
    //		for (it = ls.begin(); it != ls.end(); it++)
    //			cout << " " << *it;
    		cout << endl;
    	}
    }
    
    int main()
    {
    					// 要素を最後に追加(サイズは自動的に増加)
    	cout << "**初期設定**\n";
    	list<int> ls1;
    	ls1.push_back(0);
    	ls1.push_back(2);
    	ls1.push_back(4);
    	ls1.push_back(3);
    	ls1.push_back(1);
    	print("ls1", ls1);
    //	list<int> ls1 = {0, 2, 4, 3, 1};
    					// 2 番目の要素の前,及び,先頭に要素を追加
    	cout << "**2 番目の要素の前,及び,先頭に要素を追加**\n";
    	list<int>::iterator it = ls1.begin();
    	it++;
    	ls1.insert(it, 5);
    //	ls1.emplace(it, 5);
    	ls1.push_front(-1);
    	print("ls1", ls1);
    					// 3 番目の要素,最初,及び,最後の要素を削除
    	cout << "**3 番目の要素,最初,及び,最後の要素を削除**\n";
    	it = ls1.begin();
    	it++;
    	it++;
    	ls1.erase(it);
    	ls1.pop_front();
    	ls1.pop_back();
    	print("ls1", ls1);
    					// 値が 2 である要素,及び,奇数である要素を削除
    	cout << "**値が 2 である要素,及び,奇数である要素を削除**\n";
    	ls1.remove(2);
    	ls1.remove_if(is_odd());   // 単項関数オブジェクト
    //	ls1.remove_if(is_odd);   // 関数
    //	ls1.remove_if([](int x){ return x%2 > 0; });   // ラムダ式
    	print("ls1", ls1);
    					// 演算子で比較
    	cout << "**比較**\n";
    	list<int> ls2 = {0, 4};
    	print("ls2", ls2);
    	if (ls1 == ls2)
    		cout << "  2 つのコンテナ内の要素はすべて等しい\n";
    					// ls2 の 2 番目の要素を ls1 に代入
    	cout << "**ls2 の 2 番目の要素を ls1 に代入**\n";
    	it = ls2.begin();
    	it++;
    	ls1.assign(it, ls2.end());
    	print("ls1", ls1);
    					// ls1 と ls2 を入れ替える
    	cout << "**ls1 と ls2 を入れ替える**\n";
    	print("入れ替え前:ls1", ls1);
    	print("入れ替え前:ls2", ls2);
    	ls1.swap(ls2);
    	print("ls1", ls1);
    	print("ls2", ls2);
    					// ls1 のすべての要素を削除
    	cout << "**ls1 のすべての要素を削除**\n";
    	ls1.clear();
    	print("ls1", ls1);
    
    	return 0;
    }
    			
    (出力)
    **初期設定**
    ls1 の要素数: 5
     0 2 4 3 1
    **2 番目の要素の前,及び,先頭に要素を追加**
    ls1 の要素数: 7
     -1 0 5 2 4 3 1
    **3 番目の要素,最初,及び,最後の要素を削除**
    ls1 の要素数: 4
     0 2 4 3
    **値が 2 である要素,及び,奇数である要素を削除**
    ls1 の要素数: 2
     0 4
    **比較**
    ls2 の要素数: 2
     0 4
      2 つのコンテナ内の要素はすべて等しい
    **ls2 の 2 番目の要素を ls1 に代入**
    ls1 の要素数: 1
     4
    **ls1 と ls2 を入れ替える**
    入れ替え前:ls1 の要素数: 1
     4
    入れ替え前:ls2 の要素数: 2
     0 4
    ls1 の要素数: 2
     0 4
    ls2 の要素数: 1
     4
    **ls1 のすべての要素を削除**
      コンテナ ls1 は空です
    			
  2. list のソートやマージに対する使用方法です.
    #include <iostream>
    #include <list>
    #include <functional>
    
    using namespace std;
    
    void print(string str, list<int> &ls) {
    	if (ls.empty())
    		cout << "コンテナ " << str << " は空です\n";
    	else {
    		cout << str << " の要素数: " << ls.size() << endl;
    		for (auto x : ls)
    			printf("  %d", x);
    		printf("\n");
    	}
    }
    
    int main()
    {
    					// ls1,ls2 の初期化
    	cout << "**初期設定**\n";
    	list<int> ls1 = {5, 0, 2, 0, 3};
    	print("ls1", ls1);
    	list<int> ls2 = {0, 3, 0, 4, 1};
    	print("ls2", ls2);
    					// ls1,ls2 の sort
    	cout << "**ls1,ls2 の sort**\n";
    	ls1.sort(less<int>());   // 二項関数オブジェクト less
    	print("ls1", ls1);
    	ls2.sort(less<int>());
    	print("ls2", ls2);
    					// マージ
    	cout << "**マージ**\n";
    	ls1.merge(ls2, less<int>());
    	print("ls1", ls1);
    	print("ls2", ls2);
    					// 同じ要素を削除
    	cout << "**同じ要素を削除**\n";
    	ls1.unique();
    	print("ls1", ls1);
    					// ls2 の 2 番目の要素を ls1 の 3 番目の要素の前に接続
    	cout << "**ls2 の 2 番目の要素を ls1 の 3 番目の要素の前に接続**\n";
    	ls2.push_back(6);
    	ls2.push_back(7);
    	ls2.push_back(8);
    	print("ls2", ls2);
    	list<int>::iterator it1;
    	it1 = ls1.begin();
    	it1++;
    	it1++;
    	list<int>::iterator it2;
    	it2 = ls2.begin();
    	it2++;
    	ls1.splice(it1, ls2, it2);;
    	print("ls1", ls1);
    	print("ls2", ls2);
    
    	return 0;
    }
    			
    (出力)
    **初期設定**
    ls1 の要素数: 5
      5  0  2  0  3
    ls2 の要素数: 5
      0  3  0  4  1
    **ls1,ls2 の sort**
    ls1 の要素数: 5
      0  0  2  3  5
    ls2 の要素数: 5
      0  0  1  3  4
    **マージ**
    ls1 の要素数: 10
      0  0  0  0  1  2  3  3  4  5
    コンテナ ls2 は空です
    **同じ要素を削除**
    ls1 の要素数: 6
      0  1  2  3  4  5
    **ls2 の 2 番目の要素を ls1 の 3 番目の要素の前に接続**
    ls2 の要素数: 3
      6  7  8
    ls1 の要素数: 7
      0  1  7  2  3  4  5
    ls2 の要素数: 2
      6  8
    			
[参照]

vectorsetmultimaparrayforward_listmapmultisetpriority_queuequeuestackdequeunordered_mapunordered_multimapunordered_setunordered_multiset

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