Graph library - graph interface
The comment in add_vertex is confusing and at contradicts what the code does.  If vertex already exists in _graph, the existing vertex will be replaced with an empty one, then the size increased (causing the internal _size to be incorrect).  Depending on what behavior you want when adding a vertex that already exists, you can use _graph.try_emplace, _graph.insert_or_assign, or just _graph[vertex] (to add a new entry if it does not exist, and do nothing if it does).

There is no benefit to maintaining a distinct _size variable.  As shown above, it can get out of sync with the actual size.  It is better to just call _graph.size() whenever the user calls Graph::size.

In remove_vertex, you should check the return value from _graph.erase to see if something was actually removed.  If nothing was removed there's no benefit to running any of the other code in the function.  Also, the if (it == v.second.end()) check should not return, as you avoid scanning the rest of the vertexes in _graph to remove edges that connect to the vertex that was just removed.  Alternatively, you can just replace that whole loop body with a call to either v.second.remove or v.second.remove_if.  (The same change can be made in remove_edge.)