C++中如何用new初始化不同初始大小的vector数组
解决C++中用new初始化vector数组的问题
嘿,我来帮你搞定这个问题!你想通过new创建一个包含2个vector<test>的数组,让每个vector分别有10和20个初始元素,但代码跑不起来,甚至栈上的数组也报错,核心原因是你对C++的列表初始化和vector构造函数的优先级理解有点偏差,咱们一步步拆解:
为什么你的代码会失败?
你写的{{10},{20}}是列表初始化语法,但这里有两个坑:
- 构造函数优先级问题:C++11之后,列表初始化(
{})会优先匹配vector的initializer_list<T>构造函数,也就是说{10}会被编译器理解为「创建一个包含1个test元素的vector」,而不是「创建一个大小为10的vector」。 - 元素构造不匹配:你的
test类注释掉了接受int的构造函数,所以编译器没法把10转换成test对象,自然就报错了。哪怕你打开那个构造函数,结果也不是你想要的——它会创建只有1个元素的vector,而不是10个元素。
正确的解决方案
方案一:显式调用vector的大小构造函数(不修改test类)
因为vector的explicit vector(size_type n)构造函数是用来创建包含n个默认构造元素的vector,但它是explicit的,不能通过列表初始化的单个int触发,所以我们需要显式用()来构造每个vector:
修改后的完整代码:
#include <iostream> #include <vector> using namespace std; class test{ public : int member {0}; void fun(){cout << "member is " << member << endl;} test(){} // 保持这个构造函数注释也没问题 //test(int param) : member(param){} }; int main() { // 堆上的vector数组,显式构造每个vector指定大小 vector<test> *vp = new vector<test>[2] { vector<test>(10), vector<test>(20) }; // 验证一下大小是否符合预期 cout << "vp[0]的大小:" << vp[0].size() << endl; // 输出10 cout << "vp[1]的大小:" << vp[1].size() << endl; // 输出20 // 栈上的数组也可以用同样的方式 vector<test> array[2] { vector<test>(10), vector<test>(20) }; cout << "array[0]的大小:" << array[0].size() << endl; cout << "array[1]的大小:" << array[1].size() << endl; // 别忘了释放堆上的数组内存 delete[] vp; return 0; }
方案二:用resize方法初始化大小(更直观)
如果你觉得上面的写法有点繁琐,也可以先创建空的vector数组,再调用resize方法指定大小,这样代码更易懂:
int main() { vector<test> *vp = new vector<test>[2]; vp[0].resize(10); // 把第一个vector的大小设为10 vp[1].resize(20); // 把第二个vector的大小设为20 // 验证大小 cout << "vp[0]的大小:" << vp[0].size() << endl; cout << "vp[1]的大小:" << vp[1].size() << endl; delete[] vp; return 0; }
额外提醒
如果你以后想通过列表初始化给vector塞元素(而不是指定大小),那才需要打开test类的int构造函数,比如vector<test>{10, 20}会创建包含两个test元素的vector,分别用10和20初始化——这和指定大小是完全不同的操作,可别搞混啦!
内容的提问来源于stack exchange,提问作者Han XIAO
相关产品推荐
相关产品推荐

