Вы уже получили достаточно прямой ответ на свой вопрос. Однако, исходя из того, что вы, похоже, пытаетесь выполнить, мне кажется, что менее прямой ответ действительно может быть лучше.
По крайней мере, когда я читаю ваше описание, у вас есть несколько уникальных студентов и количество курсов для каждого. Когда студент закончил курс, вы хотите найти его. Если их нет в коллекции, добавьте их. Затем добавьте данные для курса, который они закончили.
В таком случае вектор кажется мне не идеальным решением. Вы можете реализовать код несколькими различными способами, но я бы, вероятно, сделал это так:
struct course {
std::string Quarter_, Course_, Credits_, Grade_;
using std::string;
course(string const &q, string const &c, string const &cr, string const &g)
: Quarter_(q), Course_(c), Credits_(cr), Grade_(g)
{}
};
std::map<std::string, std::vector<course> > m_students;
Используя всю вашу последовательность, чтобы найти студента, вставить нового студента, если его нет с таким именем, затем добавление курсовой работы к (новой или существующей) записи студента будет выглядеть так:
m_students[strName].push_back(course(strQuarter, strCourse, strCredits, strGrade));
Возвращаясь к исходному вопросу, стандартные контейнеры предназначены для работы с значениями . Вы передаете им значение, и они сохраняют копию этого значения. Одним из следствий этого является то, что что-то вроде push_back(new XXX)
по сути всегда ошибка (в значительной степени гарантированная утечка памяти). Если у вас есть объект, просто передайте его. Если вы этого не сделаете, просто создайте временный и передать это. В Java (для одного примера) видение new XXX
повсюду является рутинным и почти неизбежным. В то время как вы можете также написать C ++ таким же образом, этого, как правило, не следует ожидать.