在具有容量/调整大小的类中初始化向量

Initializing vector in a class with capacity/resize

本文关键字:初始化 向量 容量 调整      更新时间:2023-10-16

我在使用vector作为私有数据成员时遇到了很多麻烦。我不确定如何为 10 个元素保留空间,我尝试了调整大小的组合,我也尝试在类的构造函数中调用矢量构造函数,但我不断收到来自矢量构造函数的编译错误。我想用 10 个元素初始化向量,因为我正在尝试用二叉树中的值填充向量。

class bst
{
public:
    // constructor:  initializes an empty tree
    bst() 
   {
        root = nullptr;
        totalNodes = 0;
        treeHeight = -1; // empty tree with no nodes has a height of -1
        myVector->reserve(10);
    }
private:
    bst_node * root;
    int totalNodes;
    std::vector<T> *myVector;
    int treeHeight; // height of the tree to be used later for some functions
}; // end class bst
void _to_vector(bst_node *r, std::vector<T> *vec) 
{
    if (r == nullptr) {
        return;
    }
    _to_vector(r->left, vec);
    vec->push_back(r->val);
    _to_vector(r->right, vec);
}

reserve(( 与 resize(( 不同。有关详细说明,请参阅此答案。https://stackoverflow.com/a/7397862/9281750

由于你想用 10 个元素(即大小为 10(初始化你的向量,你应该在构造函数中使用 resize() 而不是reserve()

另一种解决方案是直接在初始化列表中使用向量的构造函数。

bst() :  myVector(new vector<T>(10)) {...} //myVector is initialized with 10 default T elements

此外,指向 std::vector 的指针通常不是必需的。你可以简单地将 myVector 变成函数中的 std::vector 和 pass-by-reference。以下操作应执行相同的操作

class bst
{
public:
    // constructor:  initializes an empty tree
    bst() : myVector(10)
   {
       ...
    }
private:
    ...
    std::vector<T> myVector;
    ...
}; // end class bst
void _to_vector(bst_node *r, std::vector<T>& vec) 
{
    if (r == nullptr) {
        return;
    }
    _to_vector(r->left, vec);
    vec.push_back(r->val);
    _to_vector(r->right, vec);
}