本当にvectorをよく知ってるでしょ?


今日のデバッガではvectorの実装のメモリメカニズムを何気なく発見し、簡単なテストプログラムを以下のように特筆しました.
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;
class test
{
    friend ostream &operator << (ostream &output, const test &obj)
    {
        output << obj.value;
        return output;
    }
    public:
        test(int a) : value(a) { cout << "construct " << value << endl;};
        ~test() {cout << "destruct " << value << endl;};
    private:
        int value;
};


int main(int argc, char *argv[])
{
    test t1(1),t2(2), t3(3), t4(4);
    ostream_iterator<test> output(cout, " ");
    vector<test> vt;

    vt.push_back(t1);
    vt.push_back(t2);
    vt.push_back(t3);
    vt.push_back(t4);

    copy(vt.begin(), vt.end(), output);

    cout << endl;
    cout << "erase first elemant: " << endl;
    vt.erase(vt.begin());

    copy(vt.begin(), vt.end(), output);
    cout << endl;

    return 0;
}

このプログラムの出力は次のとおりです.
:!./a.out
construct 1
construct 2
construct 3
construct 4
destruct 1
destruct 1
destruct 2
1 2 3 4 
erase first elemant: 
destruct 4
2 3 4 
destruct 2
destruct 3
destruct 4
destruct 4
destruct 3
destruct 2
destruct 1

このプログラムは主にvectorがpushを呼び出していることを示しています.backおよびerase時の内部メモリの変化状況.他のメンバー関数、例えばinsertも大同小異であると推定される.
どうですか.このプログラムの出力を完全に理解できますか.