【问题标题】:how to reserve vector space for class objects? [duplicate]如何为类对象保留向量空间? [复制]
【发布时间】:2011-11-25 18:29:05
【问题描述】:

如果我有一个类的头文件,如下所示:

class arrayStack
{
    private:
        struct StackNode
    {
    StackNode(int p, int v):previous(p),value(v){}
    ~StackNode(){std::cout<<"destructor calledn"<<std::endl;}
    int previous;
    int value;
    };

    public:
    static const int STACKSIZE=100;
    static const int NUMSTACK=3;
    static int indexUsed;
    arrayStack();
    ~arrayStack();
        void push(int stackNum, int val);
    int top(int stackNum);
    void pop(int stackNum);
    bool isEmpty(int stackNum);
    vector<StackNode*> buffer;
        int stackPointer[NUMSTACK];
};

这是cpp文件的内容:

  void arrayStack::push(int stackNum, int val)
  {
int lastIdx=stackPointer[stackNum];
stackPointer[stackNum]=indexUsed;
indexUsed++;
buffer[stackPointer[stackNum]]=new StackNode(lastIdx,val);
  }

  int arrayStack::top(int stackNum)
  {
return buffer[stackPointer[stackNum]]->value;
  }

基本上,我知道我需要将 STACKSIZE*NUMSTACK StackNode* 存储在向量缓冲区中(我知道我在这里只使用了一个数组)。现在,我想知道如何在 ctor 中为缓冲区保留足够大的空间。

这是我尝试过的:

    buffer.reserve(STACKSIZE*NUMSTACK*sizeof(StackNode*))

但它似乎不起作用,因为在客户端代码中,当我尝试时:

    arrayStack tStack;

for(int i=0;i<3;i++)
    for(int j=0; j<10;j++)
    {
        tStack.push(i,i+j);
    }

由于下标向量分配,程序崩溃。

【问题讨论】:

  • push 是什么?此外,reserve 采用元素的数量,而不是内存量(以字节为单位),因此您预留了太多。
  • 为什么需要将指针存储在 std::vector 中?请注意,为容器保留内存并不意味着您要构建那么多元素,它只是预先分配的内存。

标签: c++ vector


【解决方案1】:

听起来像是想使用resize 函数,而不是reserve

另外,正如评论中提到的,函数的参数是元素数,而不是字节数。

如果您调用buffer.resize(23),它将为您提供一个包含 23 个空指针的向量,然后您可以使用方括号对其进行读取/修改。

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2018-12-27
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    相关资源
    最近更新 更多