【问题标题】:Initializing vector in a class with capacity/resize在具有容量/调整大小的类中初始化向量
【发布时间】:2018-04-15 20:05:28
【问题描述】:

我在使用 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);
}

【问题讨论】:

  • 你没有向量,你有一个指针。
  • std::vector&lt;T&gt; *myVector非常不太可能是个好主意。哪本书教你的?
  • 由于myVector是一个vector*,你可以在构造函数的初始化列表中使用myVector(new vector(10))来初始化10个元素。然而,正如其他人所提到的,为什么不把它变成一个向量
  • 不要对这里的否决票挑剔,我也不是为不好的问题辩护的人,但是:这不是一个愚蠢的问题。这显然是一个 C++ 初学者寻求帮助,他们说出了他们试图做什么,解释了他们遇到的问题,没有要求解决家庭作业问题,并展示了他们的代码。在你抱怨“他们应该在问之前做更多的研究”之前,两个词:“指针。初学者。”当然,如果有更多的经验,这可能会很明显,但这正是我的观点。赞成这个问题只是为了抵消反对票。
  • @frasnian 这可能不是一个愚蠢的问题,但它远非好,并且不太可能引出好的答案或对当前形式的任何人有用。 minimal reproducible example 将是一个很好的起点。另外,How to Ask。令人难以置信的是它有 3 票赞成。

标签: c++ vector constructor


【解决方案1】:

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 并在函数中传递引用。以下应该执行相同的操作

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多