web-dev-qa-db-ja.com

独自のSTLコンテナーの作成

STLコンテナのように動作する新しいコンテナを作成する方法に関するガイドラインはありますか?

114
Avinash

C++標準がコンテナ実装に課すコンテナと要件に関するC++標準セクションを読む必要があります。

C++ 03標準の関連する章は次のとおりです。

セクション23.1コンテナ要件

C++ 11標準の関連する章は次のとおりです。

セクション23.2コンテナ要件

C++ 11標準の最終段階のドラフトは自由に入手できますhere

同様に、コンテナのユーザーの観点から要件を理解するのに役立つ優れた本を読むこともできます。私の心を簡単に打った2つの優れた本は次のとおりです。

有効なSTLbyScott Meyers
C++標準ライブラリ:チュートリアルとリファレンスbyNicolai Josutils

26
Alok Save

これは、基本的にstd::vectorのラッパーであり、STLイテレータを模倣する独自の(しかし実際の)イテレータを持つ、偽ベクトルの非常に単純な実装です。繰り返しますが、イテレータは非常に単純化されており、const_iterator、妥当性チェックなどの多くの概念をスキップします。

コードはそのまま実行可能です。

#include <iostream>
#include <string>
#include <vector>

template<typename T>
struct It
{
    std::vector<T>& vec_;
    int pointer_;

    It(std::vector<T>& vec) : vec_{vec}, pointer_{0} {}

    It(std::vector<T>& vec, int size) : vec_{vec}, pointer_{size} {}

    bool operator!=(const It<T>& other) const
    {
        return !(*this == other);
    }

    bool operator==(const It<T>& other) const
    {
        return pointer_ == other.pointer_;
    }

    It& operator++()
    {
        ++pointer_;            
        return *this;
    }

    T& operator*() const
    {
        return vec_.at(pointer_);   
    }
};

template<typename T>
struct Vector
{
    std::vector<T> vec_;

    void Push_back(T item)
    {
        vec_.Push_back(item);
    };

    It<T> begin()
    {
        return It<T>(vec_);
    }

    It<T> end()
    {
        return It<T>(vec_, vec_.size());
    }
};

int main()
{
  Vector<int> vec;
  vec.Push_back(1);
  vec.Push_back(2);
  vec.Push_back(3);

  bool first = true;
  for (It<int> it = vec.begin(); it != vec.end(); ++it)
  {
      if (first) //modify container once while iterating
      {
          vec.Push_back(4);
          first = false;
      }

      std::cout << *it << '\n'; //print it 
      (*it)++;                  //change it
  }

  for (It<int> it = vec.begin(); it != vec.end(); ++it)
  {
      std::cout << *it << '\n'; //should see changed value
  }
}
4
PoweredByRice