Вектор C ++: неиспользованная емкость - PullRequest
0 голосов
/ 03 октября 2018

Я новичок в C ++, в настоящее время я работаю над этим проектом расписания занятий, и вот моя функция add_course.Я храню идентификатор ученика, семестр и список классов на карте.Это работает (я могу добавить курс к ученику и посмотреть его, когда я распечатываю расписание ученика), но каждый раз, когда я запускаю код, всегда появляется исключение:

Exception thrown: read access violation.
std::_Vector_alloc<std::_Vec_base_types<course *,std::allocator<course *> > >::_Myend(...) returned 0xC.

Я путаюсь, почему это происходит,Значит ли это, что у моего вектора больше емкости, чем нужно?

void add_course(map<int, map<int, vector<course *> * > > &DB, int semester, int id, course c) {
    const string a = c.name;
    course* b = new course(a, c.section, c.credits);
    if (DB[id].empty()) {
        vector<course*> *p2 = new vector<course*>;
        (*p2) = { b };
        DB[id][semester] = p2; 
        return;
    }
    else
        DB[id][semester]->push_back(b);
    return;
}

1 Ответ

0 голосов
/ 03 октября 2018

Ваш код предполагает, что если DB[id] имеет любой семестр, он имеет семестр semester:

if (DB[id].empty()) {
   // ...
}
else
    DB[id][semester]->push_back(b);

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

Вместо этого вы можете попробовать:

if (!DB[id].count(semester)) {
   // ...
}
else
    DB[id][semester]->push_back(b);

… который фактически проверяет существование конкретного элемента внутренней карты.

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

void add_course(
   map<int, map<int, vector<course>>>& DB,
   const int semester,
   const int id,
   const course c
)
{
    DB[id][semester].emplace_back(c.name, c.section, c.credits);
}

Разве это не лучше?!

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