要素数が「最大N個」の配列が欲しい場合がある。std::vectorではnewでヒープに確保されるので重すぎる。std::arrayはスタックに確保できるがpush_backできない。
そんなわけで、push_backできるがスタックに置ける配列を考える。
#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); } }
実行例