类中vector私有成员初始化问题:如何预分配10个元素空间
解决类中私有vector成员预分配10个元素的问题
嘿,我看到你在把std::vector作为二叉树类bst的私有成员时遇到了预分配空间的问题——想初始化一个包含10个元素的vector来存储二叉树的值,但尝试resize或者直接调用vector构造函数时总是出现编译报错,对吧?我来给你拆解几种靠谱的实现方式,顺便帮你排查可能踩的坑。
最推荐的方式:用类构造函数初始化列表直接初始化
这是C++中初始化类成员最规范、效率最高的方式,能直接调用vector的构造函数,完全避免编译问题。假设你的私有vector成员叫tree_values(用来存int类型的二叉树节点值),代码可以这么写:
#include <vector> // 先提前定义二叉树节点类(如果有的话) struct Node { int val; Node* left; Node* right; Node(int x) : val(x), left(nullptr), right(nullptr) {} }; class bst { private: std::vector<int> tree_values; Node* root; public: // 用初始化列表直接调用vector的构造函数,创建10个默认值元素 bst() : tree_values(10), root(nullptr) { // 如果需要给这10个元素赋自定义初始值,比如全设为-1,可以在这里补充: // std::fill(tree_values.begin(), tree_values.end(), -1); } // 其他成员函数,比如遍历二叉树填充vector的逻辑... };
这里tree_values(10)会直接触发vector的构造函数,生成一个包含10个默认构造元素的容器(比如int类型就是10个0),完美匹配你“初始化包含10个元素”的需求。
备选方案:在构造函数体内用resize方法
如果你更习惯在构造函数的函数体里操作,也可以用resize来实现,但要注意成员变量的声明要正确,不要重复定义:
class bst { private: std::vector<int> tree_values; Node* root; public: bst() : root(nullptr) { // 调用resize预分配并创建10个元素 tree_values.resize(10); // 要是需要逐个设置元素值,也可以这么写: // for (size_t i = 0; i < tree_values.size(); ++i) { // tree_values[i] = i; // 比如给第i个元素设为i // } } };
这种方式也能达到目的,但初始化列表的方式更高效,因为它避免了vector先默认构造、再resize的额外内存操作。
你可能遇到的编译报错原因
你说调用vector构造函数时报错,大概率是这几个常见问题:
- 忘记包含
<vector>头文件:编译器根本不认识std::vector,自然会报错 - 初始化列表语法错误:比如把括号写成了不匹配的符号,或者写错了成员变量的名字
- 重复定义成员:比如在类里已经声明了
tree_values,又在构造函数里重新定义了一遍
额外提醒:别搞混reserve和resize
这里要特别区分一下:如果你只是想预分配内存空间但不创建元素,可以用reserve(10),但这时候vector的size()还是0,不能直接通过下标访问元素。而你的需求是拥有10个可直接使用的元素,所以必须用resize(10)或者直接调用带大小参数的vector构造函数。
内容的提问来源于stack exchange,提问作者Shinji-san
相关产品推荐
相关产品推荐

