Я изучаю С++, и у меня проблемы с указателями на структуры, хранящиеся в векторе. Проблема в том, что мне нужно дважды отсортировать структуру Student. Один раз по идентификатору учащегося, а другой раз по имени учащегося, чтобы в нем было легко искать значения. Из-за этого я создал два вектора указателей:
vector<Student *> sortedByID;
vector<Student *> sortedByName;
Структура выглядит так, и я также сохраняю ее в векторе (хотя, вероятно, это не очень хорошая идея):
struct Student {
int id;
string name;
};
vector <Student> students;
Я создаю новую структуру с помощью push_back и заполняю ее параметрами из функции (да, у меня есть конструктор). Чтобы отсортировать вектор указателей, я использую lower_bound, как показано ниже:
students.push_back(Student(id, name));
it = lower_bound(sortedByID.begin(), sortedByID.end(), id, cmp());
sortedByID.insert(it, &(students.back()));
//the same for name
Проблема в том, что каждый раз, когда я добавляю структуру с помощью push_back, она перераспределяет новый вектор и уничтожает адреса предыдущих объектов, поэтому указатели в векторе sortedByID указывают на недопустимое значение. Я думаю, что то же самое было бы с массивом структур, потому что, когда массив заполнен, нет другого способа (насколько я знаю) изменить его размер, кроме как создать новый массив и скопировать все данные из предыдущего. (поэтому адрес снова изменится).
Есть ли какой-то умный способ решить эту проблему? Обратите внимание, что мне разрешено использовать только вектор, а не какие-либо другие контейнеры из STL.
students
. Конечно, тогда вы должны убедиться, что не удаляете из серединыstudents
без пересчета сортировки. - person M.M   schedule 30.03.2016vector
, да? Не похоже на реальную проблему мира не так ли? :закатывать глаза: - person mainactual   schedule 31.03.2016vector
. Если он заполняется только один раз и вы заранее знаете размер вектора или массива, адреса памяти не изменятся. - person Mark Nunberg   schedule 31.03.2016std::map< int, std::shared_ptr<Student> >
иstd::multimap< std::string, std::shared_ptr<Student> >
. Это отвечает на вопрос о сохранении указателей в силе.vector
изация зависит от вас. - person mainactual   schedule 31.03.2016