listクラス

http://www.geocities.jp/ky_webid/cpp/library/003.html

vectorクラスは配列のエミュレートでしたが、listクラスは双方向リストを便利に扱うためのクラスです。

まずは値の追加の仕方からやってみます。

#include <iostream>
#include <list>
using namespace std;

int main () {
    list<int> data;
    
    for(int i=0;i<5;++i) {
        // 後ろへ値を追加する
        data.push_back(i);
    }
    
    for(int i=0;i<5;++i) {
        // 前へ値を追加する
        data.push_front(i*10);
    }
}

vectorと似ていますが、push_frontという前から値を追加するメンバ関数が増えています。

表示にはイテレータを使います。listはあくまでもlistなのでvectorのように[]演算子オーバーロードによるアクセスはできません。

#include <iostream>
#include <list>
using namespace std;

int main () {
    list<int> data;
    
    for(int i=0;i<5;++i) {
        data.push_back(i);
    }
    
    for(int i=0;i<5;++i) {
        data.push_front(i*10);
    }
    
    list<int>::iterator it = data.begin();
    
    while( it != data.end() ) {
        cout << *it << endl;
        it++;
    }
}
$ main
40
30
20
10
0
0
1
2
3
4

sort関数でソートもできます。

#include <iostream>
#include <list>
using namespace std;

int main () {
    list<int> data;
    
    for(int i=0;i<5;++i) {
        data.push_back(i);
    }
    
    for(int i=0;i<5;++i) {
        data.push_front(i*10);
    }
    
    // 昇順でソートする
    data.sort();
    
    list<int>::iterator it = data.begin();
    
    while( it != data.end() ) {
        cout << *it << endl;
        it++;
    }
}
$ main
0
0
1
2
3
4
10
20
30
40

降順でソートする場合はfunctionalヘッダを読み込んでgreaterテンプレートを使用します。

#include <iostream>
#include <list>
#include <functional>
using namespace std;

int main () {
    list<int> data;
    
    for(int i=0;i<5;++i) {
        data.push_back(i);
    }
    
    for(int i=0;i<5;++i) {
        data.push_front(i*10);
    }
    
    // 降順でソートする
    data.sort( greater<int>() );
    
    list<int>::iterator it = data.begin();
    
    while( it != data.end() ) {
        cout << *it << endl;
        it++;
    }
}
$ main
40
30
20
10
4
3
2
1
0
0

ちゃんと降順になっていますね。