【新機能】作り忘れたまとめはありませんか?31日前まで期間指定してまとめが作れる高度な検索ができました。有料APIだからツイートの漏れはありません!

size() == 0とempty() はどちらを使うべきか?の様々なご意見まとめ

個人的に気になったので後日読み返すためのメモです。
19210view 38コメント
16
ログインして広告を非表示にする
にゃおきゃっと @nyaocat 2017-09-11 13:38:20
読み易さをあまり追求すると宗教になるのは、まぁその通りだと思いますが、私が普段指摘しているのは size() == 0 じゃなくて empty() を使ってくださいね、といった感じの、恐らくあまり反対される方はいらっしゃらないであろう内容が中心です。
ボストン@れい @chaco_LONI 2017-09-11 13:39:59
sizeとemptyはSTLの話ならそもそもみやすさとかじゃなくて処理不可に直結する大問題なんだけど
雷更新世 @pleist 2017-09-11 23:28:06
ちょっと理解できない。「empty()」より「size() == 0」 の方が読みやすい。わざわざsizeが0である時だけ専用の関数を用意して覚える事を増やすのが嫌い。1つだけならともかくそこここでこのレベルの何もやってない関数が増えるとかなりつらい。 >
雷更新世 @pleist 2017-09-11 23:39:53
あと、読みにくさの他に書きにくさもある。「size」に加えて「empty」という関数を覚えないとプログラムが書けない。
だい @dais197x 2017-09-11 23:45:11
@nyaocat size() == 0 でも empty() でも読みやすさ(目に入って理解するまでの時間)はほとんど変わらないと思います。となると違いは修辞的な部分なわけで、そういうのはコード担当者の裁量に任せます。美意識の押し付けになっちゃう。
fjのYog教祖様 @fjs_kyousosama 2017-09-11 23:56:33
@nyaocat …まって。その2つ、英語の意味が違う… empty() って言うのは「ボウルのように容量はあるけれど、中身が入っていない」状態の事なので、size() == 1リットルで empty() とかあるし、size() == 0 の場合、empty() は真偽どちらでも良い事に…
にゃおきゃっと @nyaocat 2017-09-12 09:41:35
size() == 0 を empty() にしろと言うのは美意識の押し付けだそうです
バンビちゃん@実際プログラマに向いてない @pink_bangbi 2017-09-12 09:46:41
size() == 0 でも empty() でも同等の機能であれば個人的にはどちらでもいい気はするけど、1つのコードで両方が混載していると『これ、なにか意味が違うんだろうか…』と勘ぐってしまうような弊害は発生しそう
ぜろゆ @zer0_u 2017-09-12 09:46:53
empty()とsize()==0、利用する文脈によるとしか言えない 何をもって集合がemptyなのかはわからないけどとりあえず空ならOKなら前者、厳密にサイズにまつわる処理をしたいなら後者かな
にゃおきゃっと @nyaocat 2017-09-12 09:47:31
size()==0 と empty() だと文字数はあまり変わらないからそう思うのでしょうか。find() を使うか、 for と if と break で書くか、という話にしておけば良かったですね。
_ @apstndb 2017-09-12 09:48:14
この size が 0 か判定するのではなく empty を使うというのに同意しない人がわりと居るというのが面白い。size を取得する計算量が定数ではない場合があるから empty があるなら empty を使うのが刷り込まれているし size 使われると違和感ある。
バンビちゃん@実際プログラマに向いてない @pink_bangbi 2017-09-12 09:51:12
まあ『size() == 0 を empty() になおして』は別におかしくはないけど『empty() を size() == 0 になおして』はおかしいし、そういうことでは
バンビちゃん@実際プログラマに向いてない @pink_bangbi 2017-09-12 09:52:41
そもそも size() == 0 と empty() は可読性の問題とはちょっと違う気はする
berlysia @berlysia 2017-09-12 09:53:18
空かどうかが知りたいときに、長さを得るメソッドがsizeであってそのゼロ値がゼロであることを知りたくないので、emptyを使うのがよいと言う
_ @apstndb 2017-09-12 09:53:20
他の文化は知らないが STL の文化においては empty を使うのが自然であるってのは Effective STL あたりから刷り込まれているんだな。この文化圏においては size を使うにはむしろ理由がいるはず。
Pocke(ぽっけ) @p_ck_ 2017-09-12 09:53:51
Rubyだと x.size == 0 よりも x.empty? の方が速かった気はする
にゃははー仙人 @Flast_RO 2017-09-12 09:55:52
末尾空白だろうが末尾タブだろうがタブスペース混在だろうがsize()==0だろうがempty()だろうがなんでもいいけど、機能追加とファイル移動とバグ修正とを一気にするな...
にゃおきゃっと @nyaocat 2017-09-12 09:56:55
@rita0222 はい、もちろんその理由もその通りで正しいのですが、一応元々の話題としては読み易さの話でした。実際、データ構造によってはsize()とempty()でオーダーも変わりうるので、少なくともこの場合は読み易さには関係無く empty() を使うべきですね。
焼き魚 @keitarogu 2017-09-12 09:59:22
コンパイラの視点からみると empty() は実装しやすい。STLコンテナのデータ構造によって最適化が可能だ。例えば連結リストなら size() は線形時間かかる
しぐれ @shigure954rr 2017-09-12 10:02:57
size() == 0より断然empty()のほうが読みやすいと思うけどなぁ
STB a.k.a. さとまる @stb_nissie 2017-09-12 10:06:47
分かるけど、「empty()」には利用者の判断が一切入らないのに対して、「size()==0」には利用者の判断が入る。……まあ、この程度で大袈裟な、って話なんだが、利用者の判断が入らない方が、より安全になる。 twitter.com/pleist/status/…
_ @apstndb 2017-09-12 10:12:37
size と empty の話、結局は STL の文脈を共有しているかどうかっていう話になる。 size が定数の場合には empty は不要といっても STL に empty はあるし、STL 的には empty の意味論は明確なのですね。
_ @apstndb 2017-09-12 10:17:45
list.size() も constant time であることが規定された C++11 以降から C++ がはじまっていれば、そもそも empty なんて作らなければ良かったんや、という気持ちは分かる。
いわた @wonderful_panda 2017-09-12 10:32:11
list.size() == 0 と list.empty() にそんな読みやすさの違いがあるとは思わないけど絶対にその.size()はO(1)?というのは微妙に気になる
残りを読む(98)

コメント

_ @apstndb 2017-09-14 10:49:26
まとめで見てみるとそもそもの発端が議論の余地がないと思っていたところにこれだけ違う考えが出てくるというのが面白く、 empty の否定に二重否定的な気持ち悪さを感じるというのは全くない観点だった。
白山風露@ᓚᘏᗢ @kazatsuyu 2017-09-14 11:02:49
とりあえず私の発言、前後の文脈が書いてないので何言ってんだこいつ状態だから消すか補完するかどっちかにしてほしい
bs;vzn?LKAVs @acnkhudq 2017-09-14 11:13:44
個人なら好みで、チームなら合意の上でどちらかに決めたらいい/sizeが容量を表すならcapacityのようなわかりやすい名前にラップするかな
SODA Noriyuki @n_soda 2017-09-14 11:22:23
元の話題が「size() == 0 じゃなくて empty()」で始まってるわけだし、まとめのタイトルも「size == 0とempty は」じゃなくて「size() == 0とempty() は」ってした方がいい気がするなあ。あ、僕はempty()一択派です。
Daregada @daichi14657 2017-09-14 11:22:45
昔、C言語に関して発生したmalloc-free論争「プログラム終了時まで解放されないことが確定しているバッファを、(OSが解放することが確定している場合にも)終了時に明示的に解放するか」を思い出すな
SODA Noriyuki @n_soda 2017-09-14 11:32:30
malloc-free 論争はどっちも実利がある (かならず free する方が valgrind のようなツールでメモリリーク検出しやすい vs free しない方が速い) ので揉めるのは仕方ないけど、size() == 0 と empty() で揉める理由は僕には分からないっスね。
さとうあきひろ @akihirosato1975 2017-09-14 12:01:04
これC++に限定した話って冒頭に書いとかないと混乱する。例えばPHPだとempty()は「変数に明示的に文字列の"0"やfalseが代入されてる場合」にもtrueを返してくるので、strlen()やsizeof()とかと評価した結果が明らかに異なるケースがあるし。
ちーけー @spr_tk 2017-09-14 12:18:04
こういうのって、コンパイラが最適化してくれるんじゃないのん? (そういう問題ではない)
trycatch777 @trycatch777 2017-09-14 12:21:45
20年この業界にいるとこの手の話はかなり食傷気味ですなあ。
SODA Noriyuki @n_soda 2017-09-14 12:32:32
spr_tk データ構造的に size() が O(N) のコストであるような状況で、size() == 0 を O(1) に最適化してくれるようなコンパイラは、ほぼ存在しないと考えて良いと思います。
黒ネコかもーん @peketen 2017-09-14 12:40:09
自分基準で完全に違うモノとして使い分けてる感覚。ただし、Rubyならempty?、JavaScriptならsize() === 0 みたいなプログラミング言語依存はあるなぁ。ただし、混在されてるのの修正は疲れるw
_ @apstndb 2017-09-14 12:53:44
発端は C++ クラスタの人で isEmpty() ではなくて empty() なのもあって C++ 特有の話として見ていたけど、広がった結果一般的には強制しづらいという意見も強くなった感じ
いわた @wonderful_panda 2017-09-14 12:59:45
元の発言が「読みやすさの問題」と定義している以上、議論するならsize()がO(1)である場合の話だというのは前提とするべきで、こっちは独り言のつもりだから計算量がーみたいな話をしたんだけどこうして「議論」としてまとめられると微妙なかんじ
nothing @01_02_05 2017-09-14 13:27:20
ライブラリ作って、myEmpty関数内で、size == 0の処理も行おう!
さかなさかな @yuiyui999 2017-09-14 13:30:41
文脈しだいな気がする。
ゆーや @yuhya000 2017-09-14 13:40:39
STLだと空であることを知りたい場合はempty()してたなぁ。最近はC#ばっかりでめっきりempty()してないけどw
あごにー @Agony_01 2017-09-14 14:00:38
そもそも、内容を書きたいのであって、処理を書きたいわけじゃないから基本empty()でええやろ。
さいたま・ザ・VR Developer @saitamasaitama 2017-09-14 14:09:44
大抵はエラーチェック的な処理で行われるものを、その意味が薄いのにわざとlengthチェックしてるようなコードは全部empty()にしちまえ、とは思う。 値の精査が必要な箇所は固めて配置しておく方がええ。
たるたる @heporap 2017-09-14 14:26:16
「全てnull(false、0など)で埋められた(初期化された)配列はempty()でtrueになるか」だと思う。
でき @dekijp 2017-09-14 14:58:41
size()==0 とは意味が違うモノが必要ならば、exists()==0 とか作るかも。 empty() って0やnullが入っていた場合はどっちの判定になるんだろう?
悪魔か天使か怪獣のミカタ @mikata666 2017-09-14 16:32:08
動作がまったく同じなら100万回くらいループさせて処理が速いほうでいい
きゃっつ(Kats)⊿6/24欅坂京都個別 @grayengineer 2017-09-14 20:18:09
完全に同一の機能を持つメソッドが違う名前で複数あるのだとしたら、それは言語仕様があまりスマートではないっていう話になるんじゃないかなと。まあこのケースは厳密には意味が違うんだろうから該当しないだろうけど
アルビレオ@炙りカルビ @albireo_B 2017-09-14 23:14:09
grayengineer この件は「size()とempty()の機能はまるで違うけど、意味としてはempty()とsize()==0は同じになる(代替可能)」って話なので「完全に同一の機能のメソッド」は的外れのような。どっちかというとアセンブラで「INC AじゃなくてADD A,1でもいいじゃん」みたいなのに近い
いちごまよ@もちもちぼくせる @15my 2017-09-15 01:47:31
「箱の中のボール数えて」「1、2、3、.... 12個です」「じゃあ空じゃないな」「おいそれ最初の一個見た時点で分かったろ余計な仕事させんな!!」
眠れるミソサザイ++@暑さで頭がぼーっとして眠い @marumasa58 2017-09-15 01:52:07
メモリを0バイト確保するとポインタを返すが、実際には0バイト確保しているためdeleteが必要な場合ってのがあるから怖い。この場合はempty()ではダメだな。
うにら @riafeed 2017-09-15 02:11:26
15my 今どき時間かけて頭から一個ずつ数えるとか古すぎぃ〜(C++11脳
符号 @Fine_sugar_hill 2017-09-15 02:25:22
Non-empty(要素を持つ)を二重否定でない表現でどういうかって話題になってるっぽいけど、inhabitedっていうことが多いですね
堀石 廉 (石華工匠) @Holyithylene 2017-09-15 02:32:14
会社プログラミングだと有無を言わさず「プロジェクト標準に合わせろ」になること多いからな……。そもそも可変リスト禁止とかそういうのもある(リソースが限られてるから仕方ないんだけど)
ねや @AriaSub 2017-09-15 03:02:04
emptyという特殊実装がされている言語でしか使えない 有るか無いかまず知らなければならないemptyより、「長さを表す関数が0である」と設計することの容易性は考慮されないのかなぁ
ネギ@あなたのハートにウキウキウォッチン @negi__ 2017-09-15 03:07:35
可読性と計算効率は同時に議論すると収集つかなくなる
uu @uu32555 2017-09-15 07:39:37
可読性は明らかに美意識の宗教戦争でしかないけど、計算効率も最近は「効率厨」と「コンパイラが最適化するから無意味派」と「マシンスペック高性能だから誤差派」で宗教戦争してるよねー。異教徒と仲良くしろというね。
きゃっつ(Kats)⊿6/24欅坂京都個別 @grayengineer 2017-09-15 07:43:20
albireo_B だからこのケースは該当しないって言ってますよね…
アルビレオ@炙りカルビ @albireo_B 2017-09-15 10:18:51
grayengineer それに対して「厳密には違う」なんてレベルじゃねーですだいぶ別物です、というつっこみです
つりーべる @tada_suzu 2017-09-15 11:32:53
個人的なメモのつもりだったのでいっぱいコメントが付いて逆に恐縮です…とりあえず、タイトルは変更しました。誰でも自由に変更は出来るので、このツイートが無いと、とかあればご自由にどうぞ。
つりーべる @tada_suzu 2017-09-15 11:35:23
wonderful_panda ご指摘ありがとうございます。議論→様々なご意見まとめ、と変更しました。

カテゴリーからまとめを探す

ログインして広告を非表示にする
ログインして広告を非表示にする