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;