1.自分でvectorを書く
死亡フラグ。/(^o^)\
イテレータも使えないカスコンテナができる可能性99.9%。
今すぐ死んだ方が良い。
2.STLのvectorをprotected継承してカスタマイズする
例えばこんな感じ。
C++ code
- 40 lines - codepad
これは最初からreserveしておくSTLのvector、インターフェイス制御可。
これをすることで、例えば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()); }