Указатель на вектор в структуре C ++ - PullRequest
0 голосов
/ 13 июня 2011

Я получаю несколько сбоев, связанных с тем фактом, что я использую вектор в своей структуре, который может использовать около 6000 элементов.Вот моя структура:

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

Есть ли способ сделать это так, чтобы мой вектор не вызывал ошибку в моей структуре.Вот мой вызывающий код.

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

Мой вопрос: если это проблема с выделением размера вектора в структуре, могу ли я объявить указатель на вектор и использовать его вместо того, чтобы фактически иметь его?в структуре?

Оценки это просто целое число.

Ответы [ 3 ]

2 голосов
/ 13 июня 2011

Вы напоминаете мне о подобной проблеме, с которой кто-то здесь встречался раньше. Поскольку для остальной части вашего кода недостаточно информации, я просто угадаю здесь.

Очевидно, 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 голос
/ 13 июня 2011

Если вы получили ошибку из кода vector в этой строке

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

это не значит, что проблема с вектором. это означает, что вы обращаетесь к недействительной памяти (не инициализированной или не выделенной). Возможно, current_student выходит за пределы students, или вы выделили students путем вызова malloc вместо new.

На ваш вопрос невозможно ответить, если вы не дадите больше кода.

0 голосов
/ 13 июня 2011

Прежде всего, вы не должны думать о struct как о странных вещах, которые требуют особых мер предосторожности. Они эквивалентны классу

Тогда, как указано в комментариях, вы должны добавить реальный код, потому что если вы действительно делаете:

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

тогда вы будете продолжать добавлять элементы в ваш вектор (если hasNext() работает так, как он звучит), пока не получите std::bad_alloc()

И, наконец, не беспокойтесь о размере вашего вектора: std::vector в основном уже является указателем на вектор в куче. Ваша структура останется «маленькой», независимо от того, насколько «толстым» станет ваш вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...