【问题标题】:is it possible to set the size of the inner array of a stl::deque?是否可以设置 stl::deque 的内部数组的大小?
【发布时间】:2017-08-30 11:17:45
【问题描述】:

stl::deque 实现为数组数组; this questions 解释了它在大多数情况下是如何实现的;我的问题是:是否可以设置内部数组(或块)的大小?这似乎是一个无法操纵的实现细节。是否有允许设置内部数组大小的实现?

感谢 Pinky 的回答:在 libstdc++ (gcc stl) 我们有

#ifndef _GLIBCXX_DEQUE_BUF_SIZE
#define _GLIBCXX_DEQUE_BUF_SIZE 512
#endif

  inline size_t
  __deque_buf_size(size_t __size)
  { return (__size < _GLIBCXX_DEQUE_BUF_SIZE
            ? size_t(_GLIBCXX_DEQUE_BUF_SIZE / __size) : size_t(1)); }

因此,在包含双端队列标头(用于 stdc++)之前,通过定义 _GLIBCXX_DEQUE_BUF_SIZE(#define _GLIBCXX_DEQUE_BUF_SIZE 4096 - 如果您想要此大小的内部节点)来设置内部节点的大小

__deque_buf_size 甚至有一些 doxygen 文档,因此该解决方案被记录在案(即使它没有被标准涵盖)。

  /**
   *  @brief This function controls the size of memory nodes.
   *  @param  __size  The size of an element.
   *  @return   The number (not byte size) of elements per node.
   *
   *  This function started off as a compiler kludge from SGI, but
   *  seems to be a useful wrapper around a repeated constant
   *  expression.  The @b 512 is tunable (and no other code needs to
   *  change), but no investigation has been done since inheriting the
   *  SGI code.  Touch _GLIBCXX_DEQUE_BUF_SIZE only if you know what
   *  you are doing, however: changing it breaks the binary
   *  compatibility!!
  */

【问题讨论】:

  • 我觉得可以,我看过SGI STL的源码,缓冲区大小可以通过__deque_buf_size()来确定。
  • 标准没有提到“内部数组”,所以这将是非常特定于实现的,并且可能会引发一些兼容性问题,但最终没有什么是不可能的
  • 您介意将问题中的“答案”部分移至实际答案吗?这是encouraged by SE rule

标签: c++ stl


【解决方案1】:

你可以使用它的ctor:

std::deque<int> myDeque (size, defaultValue);

或者resize函数:

std::deque<int> myDeque;
...
myDeque.resize(newSize); 

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 2023-01-15
    • 2011-09-11
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多