stack.size () против stack.empty () - PullRequest
0 голосов
/ 09 мая 2020

, чтобы проверить, пуст ли стек, мы можем использовать if(stack.size()). Тогда почему у нас есть stack.empty().
Есть ли какое-либо условие, при котором эти результаты могут отличаться, или какое-либо преимущество использования одного над другим.

1 Ответ

2 голосов
/ 09 мая 2020

В некоторой степени это выбор стиля .

Лично я считаю, что использование неявного преобразования типа bool должно быть ограничено вещами с семантикой, подобной указателю: фактические указатели, умные указатели, std::optional приходить на ум. Это повсеместно в этом контексте и просто кажется естественным.

В других контекстах это кажется странным. Сообщите о своих намерениях как можно яснее! Опять же, на мой взгляд, if(!stack.empty()) передает намерение гораздо более ясно и прямо, чем if(stack.size()).

Однако стиль - это еще не все. Если вы используете стиль размер , как правило, это может стать проблемой производительности , потому что вы полагаетесь на то, что и size(), и empty() будут одинаково быстрыми.

Представьте себе тип связанного списка, размер которого не сохраняется. Его функция empty() по-прежнему работает быстро, потому что сводится к проверке одного указателя. Но его size() должен пройти весь список, чтобы определить количество элементов. Это может быть гораздо более дорогостоящая операция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...