指向结构C ++中的向量

时间:2011-06-13 08:02:53

标签: c++ vector struct

我遇到了一些与我在我的结构中使用一个可能需要使用大约6000个元素的向量这一事实有关的崩溃。这是我的结构:

struct Students 
{
char* names;
std::vector<int> scores;
};

有没有办法让它成为我的向量不会导致我的结构导致错误。这是我的主叫代码。

while(scores.hasNext())
{
    students[current_student].scores.push_back(grade);
}

我的问题:如果这是一个结构中向量大小分配的问题,我是否可以声明一个指向向量的指针并对我的向量进行deference而不是实际在结构中?

成绩只是一个整数。

3 个答案:

答案 0 :(得分:2)

你让我想起以前遇到的类似问题。由于没有为您的其余代码提供足够的信息,我只是在这里猜测。

显然students是一个结构Students的数组。假设它已在堆上分配,如果您使用malloc执行此操作,则无法正常工作,因为 malloc将无法正确初始化结构中的成员。特别是,这里scores是一个非POD对象,它需要通过调用它的构造函数来正确构造。

// the member in your structure is not initialized
students = (struct Students*) malloc(10 * sizeof(Students));

// oops.. scores is not initialized
students[0].scores.push_back(100);

要解决此问题,您需要致电new。它将通过调用构造函数来正确初始化成员。

// ok
students = new Students[10];

答案 1 :(得分:1)

如果您从此行中的vector代码中收到错误

students[current_student].scores.push_back(grade);

这并不意味着问题出在矢量上。它的意思是你访问无效的内存(未初始化或未分配)。可能current_student已超出students范围,或者您通过致电students而不是malloc分配了new

如果不提供更多代码,就无法回答您的问题。

答案 2 :(得分:0)

首先,您不应该将struct视为需要特殊预防措施的奇怪事情。 They are equivalent to class

然后,如评论中所述,您应该添加真实代码,因为如果您真的这样做:

while(scores.hasNext())
{
  students[current_student].scores.push_back(grade);
}

然后你会继续向你的矢量添加元素(如果hasNext()听起来有效),直到你得到std::bad_alloc()

最后,不要担心向量的大小:std::vector基本上已经是指向堆中向量的指针。无论你的矢量变得多么“胖”,你的结构都将保持“小”。