c+++vectorシミュレーション実現コード

4680 ワード

vectorの紹介
1、vectorは可変サイズ配列を表すシーケンスコンテナです。
2、配列のように、vectorも使用している連続記憶空間で元素を記憶します。つまり、vectorの要素に対する以下の標的のアクセスが可能であり、配列と同様に効率的であることを意味する。しかし、配列と違ってサイズはダイナミックに変えられます。そして、容器のサイズは自動的に処理されます。
3、本質的には、vectorは動的な分配配列を使ってその要素を保存する。新しい要素が挿入されると、この配列は記憶空間を増やすためにサイズを再割り当てする必要があります。新しい配列を割り当てて、すべての要素をこの配列に移動します。時間について言えば、これは相対的な価値の高い任務です。新しい元素が容器に入るたびに、vectorは毎回大きさを割り当てられないからです。
4、vectorは空間戦略を分配します。vectorはいくつかの追加の空間を割り当てて可能な成長に適応します。なぜなら、記憶空間は実際に必要な記憶空間より大きいからです。異なるライブラリは異なる戦略を用いて空間の使用と再分配をはかる。いずれにしても、再分布は対数的に成長する間隔の大きさであり、末尾に要素を挿入するときは定数時間の複雑さで行われる。
5、従って、vectorはより多くの記憶空間を占有し、管理空間の能力を獲得するために、効率的な方法で動的に成長する。
6、他のダイナミックシーケンスコンテナと比べてlists)、vectorは要素にアクセスする時より効率的で、末尾に要素を追加して削除するのが比較的に効率的です。他の末尾にない削除や挿入操作については、より効率的です。listsとforwardよりlistsの統一したローズマリーと引用のほうがいいです。
vectorはC++STLの中の非常に重要な容器であり、vectorの底にある原理を理解して、vectorをもっと上手に使うことができます。
c+++vectorシミュレーション実現コード:

#include<iostream>
using namespace std;
namespace bit
{
 template<typename T>
 class vector
 {
 public:
 typedef T* iterator;
 public:
 T operator[](int i)
 {
  return start[i];
 }
 public:
 vector() :start(nullptr), finish(nullptr), end_of_sorage(nullptr)
 {
 }
 vector(size_t n, const T& value = T()) :start(nullptr), finish(nullptr), end_of_sorage(nullptr)
 {
  reserve(n);//   
  while (n--!=0) //   
  {
  push_back(value);
  }
 }
 template<class InPutIterator> //        
 vector(InPutIterator first, InPutIterator last):start(nullptr), finish(nullptr), end_of_sorage(nullptr)
 {
  reserve(last-first);//     
  while (first != last)
  {
  push_back(*first);
  first++;
  }
 }
 ~vector()
 {
  delete[]start;
  start = finish = end_of_sorage = nullptr;
 }
 public:
 int size()
 {
  return finish - start;
 }
 int capacity()
 {
  return end_of_sorage - start;
 }
 bool empty()
 {
  return finish == start;
 }
 void swap(vector<T>& v)
 {
  std::swap(start, v.start);
  std::swap(finish, v.finish);
  std::swap(end_of_sorage, v.end_of_sorage);
 }
 void reserve(size_t new_capacity) //   
 {
  if (new_capacity > capacity())
  {
  int old_size = size(); //      
  T* newV = new T[new_capacity]; //     
  if (start)//        
  {
   for (int i = 0; i < size(); i++) //      
   {
   newV[i] = start[i];
   }
  }
  delete[]start;//      
  start = newV;//     
  finish = start + old_size;
  end_of_sorage = start + new_capacity;
  }
 }
 void resize(int new_size, const T& value = 0) //    
 {
  if (new_size <= size())
  {
  finish = start + new_size;
  }
  if (new_size > capacity())
  {
  reserve(new_size * 2);
  }
  iterator p = finish;
  finish = start + new_size;//     
  while (p != finish) //  value
  {
  *p = value;
  p++;
  }
 }
 public:
 void push_back(const T &c)
 {
  insert(end(), c);
 }
 public:
 typedef T* iterator;
 iterator begin()
 {
  return start;
 }
 iterator end()
 {
  return finish;
 }
 public:
 iterator insert(iterator pos, const T &x) // pos     x
 {
  if (size() + 1 >= capacity())
  {
  size_t oldpos = pos - start;
  size_t new_capacity = capacity() ? (capacity() * 2) : 1;
  reserve(new_capacity);
  pos = start + oldpos;
  }
  T* p = finish;
  for (; p != pos; p--)
  {
  *p = *(p - 1);
  }
  *p = x;
  finish++;
  return pos;
 }
 iterator erase(iterator pos) //  pos   
 {
  T* p = pos;
  while (p != finish - 1)
  {
  *p = *(p + 1);
  p++;
  }
  finish--;
  return pos;
 }
 private:
 T* start;//     
 T* finish;//              
 T* end_of_sorage;//            
 };
}
int main()
{
 int ar[] = { 1,2,3,4,5,6,7,7 };
 bit::vector<int>v1(ar, ar + 6);
 bit::vector<int>v2;
 bit::vector<int>v3(10,'a');
 v1.erase(v1.end()-1);
 v1.insert(v1.begin(), 0);
 v1.swap(v3);
 for (int i = 0; i < v1.size(); i++)
 {
 cout << v1[i] << " ";
 }
 return 0;
}
締め括りをつける
以上は小编が皆さんに绍介したc++vectorシミュレーションの実现コードです。皆さんに助けてほしいです。