вектор char хорош, потому что память смежна. Поэтому вы можете использовать его со многими API C, такими как сокеты Berkley или файловые API. Вы можете сделать следующее, например:
std::vector<char> vect;
...
send(sock, &vect[0], vect.size());
и будет нормально работать.
По сути, вы можете обращаться с ним как с любым другим динамически размещаемым буфером символов. Вы можете сканировать вверх и вниз в поисках магических чисел или скороговорок. Вы можете разобрать его частично на месте. Для получения из сокета вы можете очень легко изменить его размер, чтобы добавить больше данных.
Недостаток - изменение размера не очень эффективно (изменение размера или предварительное распределение разумно), и удаление из передней части массива также будет очень неэффективным. Если вам, скажем, нужно очень часто вставлять только один или два символа за пределы структуры данных, возможно, стоит скопировать в deque перед этой обработкой. Это стоит вам копии, и память deque не является смежной, поэтому вы не можете просто передать указатель на C API.
Итог, узнайте о структурах данных и их компромиссах перед погружением, однако, как правило, вектор char используется в общих чертах.