#c #vector #struct
#c #вектор #структура
Вопрос:
Я получаю несколько сбоев, связанных с тем фактом, что я использую vector в своей структуре, которая, возможно, должна использовать около 6000 элементов. Вот моя структура:
struct Students
{
char* names;
std::vector<int> scores;
};
Есть ли способ сделать так, чтобы мой вектор не вызывал ошибку в моей структуре. Вот мой вызывающий код.
while(scores.hasNext())
{
students[current_student].scores.push_back(grade);
}
Мой вопрос: если это проблема с распределением размера вектора внутри структуры, могу ли я объявить указатель на вектор и ссылаться на свой вектор вместо того, чтобы иметь его на самом деле в структуре?
Оценки — это просто целое число.
Комментарии:
1. У вас нет «указателя на вектор в структуре». Опубликованный код не имеет смысла.
2. Проблема где-то в другом месте вашего кода.
3. требуется дополнительная информация. Какой тип
students
иgrade
? Также выдает сообщение об ошибке.4. Извините. Я только что понял, что сформулировал не весь свой вопрос. Я обновил его.
5. Я подозреваю, что в вашем вопросе отсутствует довольно много логики, которая может быть актуальной. Что такое оценки типа? — откуда это? Какого рода ошибку вы на самом деле получаете? всегда ли он находится в одном и том же месте? Все эти факты могут помочь вам устранить проблему, поскольку я не могу быть уверен, в чем заключается ваша ошибка….
Ответ №1:
Вы напоминаете мне о похожей проблеме, с которой кто-то здесь сталкивался раньше. Поскольку для остальной части вашего кода предоставлено недостаточно информации, я просто делаю предположение здесь.
Очевидно, что 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);
Чтобы решить эту проблему, вместо этого вам нужен call new
. Он будет правильно инициализировать элементы, вызывая их конструкторы.
// ok
students = new Students[10];
Ответ №2:
Если вы получаете какую-либо ошибку из vector
кода в этой строке
students[current_student].scores.push_back(grade);
это не означает, что проблема в векторе. на самом деле это означает, что вы обращаетесь к недопустимой памяти (не инициализированной или не выделенной). Возможно, current_student
он выходит за пределы students
, или вы выделили его students
с помощью вызова malloc
вместо new
.
На ваш вопрос нельзя ответить, не предоставив больше вашего кода.
Ответ №3:
Прежде всего, вы не должны думать о struct
как о странных вещах, которые требуют особых мер предосторожности. Они эквивалентны классу
Затем, как указано в комментариях, вы должны добавить реальный код, потому что, если вы действительно :
while(scores.hasNext())
{
students[current_student].scores.push_back(grade);
}
затем вы будете продолжать добавлять элементы в свой вектор (если hasNext()
работает так, как кажется), пока не получите std::bad_alloc()
И, наконец, не беспокойтесь о размере вашего вектора: a std::vector
по сути, уже является указателем на вектор в куче. Ваша структура останется «маленькой», независимо от того, насколько «толстым» станет ваш вектор.