Overall, not bad for a beginner in my opinion. Some things to note: * **Use compiler warnings** There are several (minor) warnings that you probably missed. One of them about an unused variable. * `endl` vs `\n` I'm sure your book mentions this but `endl` will flush the buffer while `\n` won't. In most cases using `\n` suffices. * **Group logic together** `cout << "Student name: ";` This is repeated and could be eliminated if you restructure the loop slightly. You should also declare variables as late as possible. So move the declaration of `student` right in front of the loop. string student; for (;;) { cout << Student name: "; getline(cin, student); if (student.empty()) { break; } students.push_back(student); } * **Use range-based `for` loops** You can use the new range based for loops instead of the old style loops e.g. `for (const auto &s : students) {` instead of `for (int s = 0; s < students.size(); s++) {` Adjust the next line accordingly: `cout << "Grades for " << s << endl;` * **Make constants constant** The `assignments` variable is never changed and should therefore be declared as a constant. * **Use functions** You are already scoping the code which is good but as @RichN pointed out you might as well use functions instead. * **Prefer `using` over typedefs** As Scott Meyers suggests in his book *Effective Modern C++*, you should prefer the new `using` directive over typedefs. For example: using vec_size = vector<string>::size_type;