スポンサーリンク

| キーワード:

最大要素数が決まったvectorクラスを作った話

要素数が「最大N個」の配列が欲しい場合がある。std::vectorではnewでヒープに確保されるので重すぎる。std::arrayはスタックに確保できるがpush_backできない。

そんなわけで、push_backできるがスタックに置ける配列を考える。

LimitedVector.hpp

#include<array>

namespace szl {

  //! @brief 最大要素数が決まっている可変長配列
  //! @tparam T arrayに入れるデータ型
  //! @tparam MAX arrayの要素数
  template<typename T, size_t MAX>
  class LimitedVector {
    std::array<T, MAX> _data;
    size_t count; //!< 現在の要素数
  public:
    LimitedVector() :count(0) {}

    auto begin() { return _data.begin(); }
    auto end() { return _data.begin() + count; }
    const auto cbegin()const { return _data.cbegin(); }
    const auto cend()const { return _data.cbegin() + count; }

    void push_back(const T& v) {

      if (count >= MAX)
        throw "count >= MAX";

      _data[count++] = v;
    }
    void pop_back() {

      if (count == 0)
        throw "count == 0";

      count--;
    }
    T& back() {

      if (count == 0)
        throw "count == 0";

      return _data[count - 1];
    }
    const T& back()const {
      return _data[count - 1];
    }
    const T* data()const { return _data; }
    T* data() { return _data; }

    size_t size()const { return count; }

    const T& operator[](const size_t index)const {
      return _data[index];
    }
    T& operator[](const size_t index) {
      return _data[index];
    }

  };

}

呼び出し例

#include "LimitedVector.hpp"

int main()
{
  szl::LimitedVector<int, 3> v;

  v.push_back(3);
  v.push_back(4);
  v.push_back(6);

  printf("%d\n", v.size());

  v[1] = 1;

  for (auto vv : v) {
      printf("-- %d\n", vv);
  }
  v.pop_back();

  printf("-------\n");
  for (auto vv : v) {
      printf("-- %d\n", vv);
  }

}

実行例

3
— 3
— 1
— 6
——-
— 3
— 1

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: