list

[機能]

  双方向リストを保持します.( STL )
template <class T, class Allocator = allocator<Key> > class list
		

[使用方法]
#include <list>
using namespace std;
list <T> 変数名;
		
[メンバー関数等]

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

[使用例]

  1. list の基本的使用方法です.奇数の要素を削除するため,単項関数オブジェクト is_odd を定義しています.
    #include <stdio.h>
    #include <list>
    #include <functional>
    using namespace std;
    
    class is_odd : public unary_function<int, bool>
    {
    	public:
    		result_type operator() (argument_type k)
    		{
    			return (result_type)(k % 2);
    		}
    };
    
    void print(char *str, list<int> &ls) {
    	if (ls.empty())
    		printf("  コンテナ %s は空です\n", str);
    	else {
    		list<int>::iterator it;
    		printf("%s の要素数: %d\n", str, ls.size());
    		for (it = ls.begin(); it != ls.end(); it++)
    			printf("  %d", *it);
    		printf("\n");
    	}
    }
    
    int main()
    {
    	list<int> ls1, ls2;
    	list<int>::iterator it;
    					// 要素を最後に追加(サイズは自動的に増加)
    	printf("**初期設定**\n");
    	ls1.push_back(0);
    	ls1.push_back(2);
    	ls1.push_back(4);
    	ls1.push_back(3);
    	ls1.push_back(1);
    	print("ls1", ls1);
    					// 2 番目の要素の前,及び,先頭に要素を追加
    	printf("**2 番目の要素の前,及び,先頭に要素を追加**\n");
    	it = ls1.begin();
    	it++;
    	ls1.insert(it, 5);
    	ls1.push_front(-1);
    	print("ls1", ls1);
    					// 3 番目の要素,最初,及び,最後の要素を削除
    	printf("**3 番目の要素,最初,及び,最後の要素を削除**\n");
    	it = ls1.begin();
    	it++;
    	it++;
    	ls1.erase(it);
    	ls1.pop_front();
    	ls1.pop_back();
    	print("ls1", ls1);
    					// 値が 2 である要素,及び,奇数である要素を削除
    	printf("**値が 2 である要素,及び,奇数である要素を削除**\n");
    	ls1.remove(2);
    	ls1.remove_if(is_odd());
    	print("ls1", ls1);
    					// 演算子で比較
    	printf("**比較**\n");
    	ls2.push_back(0);
    	ls2.push_back(4);
    	print("ls2", ls2);
    	if (ls1 == ls2)
    		printf("  2 つのコンテナ内の要素はすべて等しい\n");
    					// ls2 の 2 番目の要素を ls1 に代入
    	printf("**ls2 の 2 番目の要素を ls1 に代入**\n");
    	it = ls2.begin();
    	it++;
    	ls1.assign(it, ls2.end());
    	print("ls1", ls1);
    					// ls1 と ls2 を入れ替える
    	printf("**ls1 と ls2 を入れ替える**\n");
    	print("入れ替え前:ls1", ls1);
    	print("入れ替え前:ls2", ls2);
    	ls1.swap(ls2);
    	print("ls1", ls1);
    	print("ls2", ls2);
    					// ls1 のすべての要素を削除
    	printf("**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 <stdio.h>
    #include <list>
    #include <functional>
    using namespace std;
    
    void print(char *str, list<int> &ls) {
    	if (ls.empty())
    		printf("コンテナ %s は空です\n", str);
    	else {
    		list<int>::iterator it;
    		printf("%s の要素数: %d\n", str, ls.size());
    		for (it = ls.begin(); it != ls.end(); it++)
    			printf("  %d", *it);
    		printf("\n");
    	}
    }
    
    int main()
    {
    	list<int> ls1, ls2;
    	list<int>::iterator it;
    					// ls1,ls2 の初期化
    	printf("**初期設定**\n");
    	ls1.push_back(5);
    	ls1.push_back(0);
    	ls1.push_back(2);
    	ls1.push_back(0);
    	ls1.push_back(3);
    	print("ls1", ls1);
    
    	ls2.push_back(0);
    	ls2.push_back(3);
    	ls2.push_back(0);
    	ls2.push_back(4);
    	ls2.push_back(1);
    	print("ls2", ls2);
    					// ls1,ls2 のソート
    	printf("**ls1,ls2 のソート**\n");
    	ls1.sort(less<int>());
    	print("ls1", ls1);
    	ls2.sort(less<int>());
    	print("ls2", ls2);
    					// マージ
    	printf("**マージ**\n");
    	ls1.merge(ls2, less<int>());
    	print("ls1", ls1);
    	print("ls2", ls2);
    					// 同じ要素を削除
    	printf("**同じ要素を削除**\n");
    	ls1.unique();
    	print("ls1", ls1);
    					// ls2 の 2 番目の要素を ls1 の 3 番目の要素の前に接続
    	printf("**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 のソート**
    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
    			

ホームページ 目次 演習解答例目次 付録目次 索引