挿入イテレータ

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

値の追加を行うことができるイテレータのことを挿入イテレータを言います。

とりあえず実装してみます。

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

int main () {
    typedef list<int> listint;
    
    listint data;
    
    // 先頭にデータを挿入するためのイテレータ
    front_insert_iterator<listint> iit( data );
    
    *iit = 10;
    *iit = 20;
    *iit = 30;
    
    listint::iterator it  = data.begin();
    listint::iterator end = data.end();
    for( ; it != end; ++it ) {
        cout << *it << endl;
    }
    
    return 0;
}
$ main
30
20
10

宣言したイテレータ変数に代入していくだけで先頭に値が格納されていきます。

ですがこれって実質push_front関数が呼ばれているだけなので手続き長くなる割りにやってることはしょぼいので存在意義がいまいちわからないですね・・・。イテレータのように扱えるというのがメリットになるようなケースがあるのかもしれません。

ちなみにイテレータではないですが、関数呼び出しで代入する方法も用意されているようなのでそれも実装してみます。

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

int main () {
    typedef list<int> listint;
    
    listint data;
    
    front_inserter(data) = 10;
    front_inserter(data) = 20;
    front_inserter(data) = 30;
    
    listint::iterator it  = data.begin();
    listint::iterator end = data.end();
    for( ; it != end; ++it ) {
        cout << *it << endl;
    }
    
    return 0;
}
$ main
30
20
10

できました。あまり使い道はなさそうですが・・・。

さて先頭に対して挿入ができるなら後尾に対して挿入することもできます。

先ほどの

front_insert_iterator<listint> iit( data );

back_insert_iterator<listint> iit( data );

に変更するだけです。

関数形式の方も、back_inserterに変えるだけでOKです。

最後は汎用挿入イテレータです。これは指定の場所に挿入するイテレータです。

とりあえず使い方を見てみます。

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

int main () {
    typedef list<int> listint;
    
    listint data;
    
    // 任意の場所に挿入するイテレータ
    // 挿入箇所のイテレータを第二引数で渡す
    insert_iterator<listint> iit( data, data.begin() );
    
    *iit = 10;
    *iit = 20;
    *iit = 30;
    
    listint::iterator it  = data.begin();
    listint::iterator end = data.end();
    for( ; it != end; ++it ) {
        cout << *it << endl;
    }
    
    return 0;
}

とりあえず例ではbeginのポインタを渡して見ました。

しっかしこれ、どう考えても普通にinsert関数でデータの挿入を行えば良いような気がするんですが、こういった用途があるんでしょうかね。一つ考えられるとしたらどんなコンテナであろうとも同じようなインターフェイスで挿入が行えるということなんでしょうか?うーん、insert関数使う場合も同じようなインターフェイスなのでそうでもないっぽいですね。このあたりは追々調べてみたいと思います。