emptyとsize==0

コンテナが空(要素を持っていない)かどうかを確認するとき、タイトルの2つのメソッドのどちらを使うかという話題で界隈が盛り上がっていたようだ。

私はempty()一択だ。サイズが0かどうかを確認したいなら、size() == 0を使うべきだ。だが、コンテナが空であることを確認できるメソッドがある場合に、コンテナが空であるかを確認するために別のコードを書く理由がない。 その2つが異なる場合があるのか、というのは疑わしい。ただ、未初期化領域を区別できるようなコンテナを作って、過去のSTLの命名を全て無視して関数を命名したなら、場合によっては筋が通った形でemptyかつsize != 0という結果になることはありえるだろう。sizeはnon-zeroだが、確保してある全領域が未初期化のままなのでempty、というように。

C++では実際には、リストのようにsizeを取得するコストが定数でない可能性のあるデータ構造を考えてemptyが作られたのだろうと思われるが、list::sizeが定数時間とされてからはこの点に関してはどうでもよくなった。

問題があるとすれば、emptyの命名だろうか。C++界隈では人々は長年STLに親しんでいるのでこの名前の関数がどう機能するかについて合意しあっているが、そうでない人がこれを見た時にどう反応するかはわからない。 もしこれが、is_emptyempty?のような命名であれば、オブジェクトの状態を取得し、boolを返すというところまで含意できたのだが。

というわけで以下のようにしよう。

#define is .
std::vector<int> vec;
std::cout << std::boolalpha << vec is empty() << std::endl;

言うまでもないがこのコードは冗談だ。