回 帖 发 新 帖 刷新版面

主题:动态分配与容器

vector<string> *pvec1 = new vector<string>(10); //编译成功,分配10个类型为string的元素?
vector<string> **pvec2 = new vector<string>[10]; //编译错误,分配10个类型为string的元素?

今天在C++ PRIMER习题里看到,请问这两个分别代表什么意思?

回复列表 (共4个回复)

沙发

您先看看简单的情形:
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;

板凳

谢谢boy,另外一个问题是,接下来想输出其中一个元素,如何操作呢?
cout << *p << endl;
cout << p[0] << endl;
以上两个方法不对!

3 楼

*p和p[0]其实没有区别。
先弄清楚p是什么类型,如果p的类型是vector<string> *的话,*p的类型就是vector<string>了。这样的类型是无法直接用于cout的。
可以写:
cout << (*p)[0] << endl;
或者分开写:
vector<string>& v = *p;
cout << v[0] << endl;

4 楼

理解了,再次感谢boy

我来回复

您尚未登录,请登录后再回复。点此登录或注册