主题:动态分配与容器
aiby
[专家分:15340] 发布于 2010-10-07 20:42:00
vector<string> *pvec1 = new vector<string>(10); //编译成功,分配10个类型为string的元素?
vector<string> **pvec2 = new vector<string>[10]; //编译错误,分配10个类型为string的元素?
今天在C++ PRIMER习题里看到,请问这两个分别代表什么意思?
回复列表 (共4个回复)
沙发
eastcowboy [专家分:25370] 发布于 2010-10-07 20:55:00
您先看看简单的情形:
int *pvec1 = new int(10);
int **pvec2 = new int[10]; // 错误,new int[10]其实得到的是int*,不应该赋值给int**。
类似的,您的代码修改为:
vector<string> *pvec1 = new vector<string>(10);
vector<string> *pvec2 = new vector<string>[10];
即可。
第一句中,创建了一个vector<string>。在创建之时,构造函数带了参数,这个参数是10。
第二句中,创建了10个vector<string>所组成的数组。因为是创建一个数组,在创建之时,构造函数无法再指定任何参数。
在销毁时应该注意,因为pvec1指向一个对象,所以用delete即可销毁。而pvec2指向一个数组,所以应该用delete[]来销毁。代码:
delete pvec1;
pvec1 = 0;
delete[] pvec2;
pvec2 = 0;
板凳
aiby [专家分:15340] 发布于 2010-10-07 21:13:00
谢谢boy,另外一个问题是,接下来想输出其中一个元素,如何操作呢?
cout << *p << endl;
cout << p[0] << endl;
以上两个方法不对!
3 楼
eastcowboy [专家分:25370] 发布于 2010-10-08 15:58:00
*p和p[0]其实没有区别。
先弄清楚p是什么类型,如果p的类型是vector<string> *的话,*p的类型就是vector<string>了。这样的类型是无法直接用于cout的。
可以写:
cout << (*p)[0] << endl;
或者分开写:
vector<string>& v = *p;
cout << v[0] << endl;
4 楼
aiby [专家分:15340] 发布于 2010-10-08 21:13:00
理解了,再次感谢boy
我来回复