本当にvectorをよく知ってるでしょ?
今日のデバッガではvectorの実装のメモリメカニズムを何気なく発見し、簡単なテストプログラムを以下のように特筆しました.
このプログラムの出力は次のとおりです.
このプログラムは主にvectorがpushを呼び出していることを示しています.backおよびerase時の内部メモリの変化状況.他のメンバー関数、例えばinsertも大同小異であると推定される.
どうですか.このプログラムの出力を完全に理解できますか.
#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も大同小異であると推定される.
どうですか.このプログラムの出力を完全に理解できますか.