読者です 読者をやめる 読者になる 読者になる

STLのvectorに文句を言わずに自分で頑張る方法

1.自分でvectorを書く
死亡フラグ。/(^o^)\
イテレータも使えないカスコンテナができる可能性99.9%。
今すぐ死んだ方が良い。


2.STLvectorをprotected継承してカスタマイズする
例えばこんな感じ。
C++ code
- 40 lines - codepad

これは最初からreserveしておくSTLvector、インターフェイス制御可。
これをすることで、例えばpush_backの際にcapacityが変化したか、といったような事を監視できるし、
(ただし、insertなどのメソッドでもcapacityは変化する)
使わせたくないインターフェイスを公開しない、という事もできるし、
HogeList().swap(hogeList_);
といったようなswap技法によるクリアや、
HogeList(hogeList_).swap(hogeList_);
このようなシュリンクトゥフィットもメソッドを増やすことによってインターフェイスとして提供できる。

下記の参考Vectorは全てのコンストラクタを使えるようにしていないので実際にはコンストラクタは使えるようにすべき、ということに注意。
まぁ、あえて使わせないという手もある。

このようなことをしたらイテレータはどうするの、ということに関しては、

	v.push_back(5);
	v.push_back(4);
	v.push_back(3);
	v.push_back(2);
	v.push_back(1);
	v.push_back(0);
	
	for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
		printf("%d\n", (*it));
	}

これでいいす。

#include <vector>

template <class T, int N, class Allocator = std::allocator<T> >
class Vector : protected std::vector<T, Allocator>
{
public:
    using std::vector<T, std::allocator<T> >::iterator;
    using std::vector<T>::get_allocator;
    using std::vector<T>::max_size;
    using std::vector<T>::size;
    using std::vector<T>::empty;
    using std::vector<T>::capacity;
    using std::vector<T>::assign;
    using std::vector<T>::begin;
    using std::vector<T>::end;
    using std::vector<T>::rbegin;
    using std::vector<T>::rend;
    using std::vector<T>::operator[];
    using std::vector<T>::at;
    using std::vector<T>::resize;
    using std::vector<T>::front;
    using std::vector<T>::back;
    using std::vector<T>::push_back;
    using std::vector<T>::pop_back;
    using std::vector<T>::insert;
    using std::vector<T>::erase;
    using std::vector<T>::clear;
    using std::vector<T>::swap;
    
    explicit Vector(const Allocator& = Allocator()) : std::vector<T, Allocator>() {
        this->reserve(N);
    }
};

int main()
{
	Vector<int, 100> v;
	
	printf("capacity:%ld, size:%ld\n", v.capacity(), v.size());
}