【问题标题】:is there a standard array with fixed buffer item and dynamic item count?是否有具有固定缓冲区项和动态项数的标准数组?
【发布时间】:2014-10-30 12:47:51
【问题描述】:

我正在寻找 C++98 中的标准容器(不是 C++11 中的) 哪个会有这个规格: - 固定缓冲区大小(像一个简单的数组) - 使用计数访问器(如矢量)

这是我正在寻找的东西:

template <class TYPE, size_t ARRAY_SIZE>
  class Array
  {
    /*-------------------------------- MEMBERS ---------------------------------*/
    private:
      TYPE     _array[ARRAY_SIZE];
      size_t   _count;
    /*--------------------- CONSTRUCTORS/DESTRUCTORS ---------------------------*/
    public:
      Array():_count(0){}

    /*------------------------------- METHODS ----------------------------------*/

    public:
      inline const TYPE * data() const {return _array;}
      inline void clear() {_count= 0; }
      inline void push_back(const TYPE& i_type) {_array[_count] = i_type; _count++;}
      inline size_t count() const {return _count;}
      inline size_t max_size() const {return ARRAY_SIZE;}
      inline bool empty() const {return (_count== 0);}
      const TYPE& operator[](size_t i_index){return _array[i_index];}
  };

【问题讨论】:

  • 为什么需要它固定大小,而不是简单地以给定大小创建它并且从不增长它?您需要在编译时知道大小吗?如果有,为什么?
  • 如果 vector 不可接受(为什么不呢?),所有 C++98 提供的都是 C 样式数组,它们固定缓冲区大小,并且具有sizeof(array)/sizeof(T) 形式的大小函数。 C++11 有一个适用于固定大小数组的类(可能没有理由不能只复制标头和一些小的修复,因此它是独立的)。
  • 我需要这种容器有两个原因。 1)它用于嵌入式软件,所以我更喜欢在启动时初始化所有内存,所以我会确保所有场景都有足够的内存。 2)这种容器允许我把它放在一个类中,我可以将它作为消息发送给另一个进程,如果另一个进程具有相同的消息类定义,我可以将缓冲区转换为该类型的类并处理消息。
  • @rastafaryd 我编辑了我的答案以提供一个实现的链接。

标签: c++ arrays stl containers std


【解决方案1】:

不,没有。操纵分配器为vector 这样做也不是真正可行的。您可以自己编写,也可以在某个第三方库中查找。

Boost.Container 的 static_vector 可能很合适。

【讨论】:

    【解决方案2】:

    push_back(const TYPE&amp; i_type) {_array[_count] = i_type; _count++;}operator [] 中,您应该检查您是否越界,然后忽略或抛出适当的异常,例如 ArrayIndexOutOfBounds 之类的。

    使用std::vector,为什么要重新发明相同的轮子?

    【讨论】:

      【解决方案3】:

      有些人可能会认为这与好的 C++ 是对立的,但考虑到约束和假定的要求(包括需要在编译时知道大小),我会考虑使用简单的 C 样式数组。

      正如在 C++ 中宏和其他被认为是邪恶的构造有一个位置一样,C 数组也有一个位置。邪恶的不是工具,而是它的使用方式。

      如果您不需要在编译时知道 siae,那么我会倾向于使用 vector,预先正确调整大小并且永远不会增长它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 2019-08-17
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多