Never traversing the list. Removal every time a peer disconnects.
Removal with intrusive containers: flip two pointers.
Removal with std::vector<>: copy all the subsequent items in the vector one position backwards.
Removal with intrusive containers: flip two pointers.
Removal with std::vector<>: copy all the subsequent items in the vector one position backwards.
A vector will still give you better cache-locality and also amortize the number of allocations.
I've probably spent more years writing C++ code than C code, but I'm all with him on this - if what you need to do for whatever reason don't need/benefit all that much from C++ when accounting for all constraints, then choosing C as being the lowest common denominator between other languages is a very good choice for a library.