Помимо точки читабельности, что очень правильно, вы испытали просто артефакты одной конкретной реализации, а не единственно возможной.
То есть, нет никакой причины или требования, чтобы empty () был реализован в терминах size () как в случае вектора, так и в списке, или на самом деле в любом другом контейнере. Если есть более эффективные альтернативы, их следует использовать, если автор (ы) библиотеки некомпетентны или, что более разумно, ленивы.
Что касается списка и O (1) -ностиности size () или его отсутствия, вы должны принять во внимание, что список может реализовывать либо size () как O (1), либо splice (), но не оба (размышление о причине - интересное упражнение.) Таким образом, в вашем случае проверенная вами библиотека могла бы реализовать size () как O (1) (в этом случае splice () была бы O (n)) и, следовательно, могла бы реализовать empty () с точки зрения size () без ущерба для производительности, иначе это будет очень плохая библиотека.