void fill(int first[], int n, int val) //素直にこう書きやがれ { for (int i = 0; i < n; i++) //変数が増えることを気にしないのが富豪だ { first[i] = val; //配列要素へのアクセスには[]があるべきなんだよ } } //知ってることの精一杯がポインタのそれなんだなksks
↑ もうさ、こいつ無理にC++使わなくてよくね? 0036デフォルトの名無しさん2020/10/13(火) 12:30:12.68ID:y5TdNrxl 雑魚おつ 0037312020/10/13(火) 12:48:18.65ID:alJhtdGu いや、あの・・・ STL自体は非常に良く出来てると思うが、俺普段C++(あるいはC++11以降)マンセーSTLマンセーしてる連中は馬鹿にしてるからね・・・w お前が作ったんちゃうやろと 0038デフォルトの名無しさん2020/10/13(火) 12:50:17.06ID:FpFGKRx+ void fill(int *first, int *last, int val) { while(first < last) *first++ = val; } 0039デフォルトの名無しさん2020/10/13(火) 12:52:08.93ID:jGpIs/AO 理解は出来ないわけじゃなくSTL流に書くのが汚くて馬鹿みたいに感じるだけだ。 0040デフォルトの名無しさん2020/10/13(火) 12:54:03.28ID:jGpIs/AO 配列は処理対象を個数で表現するほうが分かり易いし完結なのに、終端要素で 表そうとするのは単にSTLのとった設計思想の都合でしかないので 馬鹿っぽく感じる。 0041デフォルトの名無しさん2020/10/13(火) 12:56:47.00ID:2ekPMyol>>37 C++11の何が気に入らんの? C++98でストレス溜まってたところを楽にしてくれてるやん 型指定子autoは同じことを二度も書かされる屈辱から解放してくれるし range-based-for-statementの見た目からは驚かされる簡潔さなんかクールだろ 俺的にはテンポラリにconstが必須でなくなって痒いところに手が届いた 0042デフォルトの名無しさん2020/10/13(火) 13:17:38.74ID:y5TdNrxl @ void fill(int first[], int n, int val) //素直にこう書きやがれ { for (int i = 0; i < n; i++) //変数が増えることを気にしないのが富豪だ { first[i] = val; //配列要素へのアクセスには[]があるべきなんだよ } } //知ってることの精一杯がポインタのそれなんだなksks
と
A void fill(int *first, int *last, int val) { while(first < last) *first++ = val; }
明らかに配列添字明示してる@のほうが無駄が多くて馬鹿っぽいけど 0043デフォルトの名無しさん2020/10/13(火) 13:19:51.21ID:2ekPMyol>>42 うん、そう言いたかった 35の最終行で言ったつもりだった 0044デフォルトの名無しさん2020/10/13(火) 13:32:32.38ID:alJhtdGu>>41 別に気に入らんとか言うとらんよvariadic templates無しの時代はキツかったし(逆に言えばテンプレート以外ではそんなに困らん) 新しいもの使ってる=上級者、だと思ってるような、権威を傘に着てる連中を馬鹿にしてると言ったの マンセーとかの辺りで察してくれ 0045デフォルトの名無しさん2020/10/13(火) 13:43:16.33ID:jGpIs/AO 伝統的にはこうで、速度も速い。 void fill(int *ptr, int n, int val) { for (int i = 0; i < n; i++) { *ptr++ = val; } }
さらに、以下のように書くほうが速い。 void fill(int *top, int n, int val) { int *ptr = top; for (int i = n; i > 0; --i) { *ptr++ = val; } } 0046デフォルトの名無しさん2020/10/13(火) 13:47:15.59ID:jGpIs/AO>>42>>43 fill()関数自体はどれでも分かりにくさは感じない。 問題はfill()関数を使う側の分かりにくさ。 btmで終わりを示す方式だと多くの場合、個数numに対して fill(first, first + num, val); のようにしか書けないことが多い。 0047デフォルトの名無しさん2020/10/13(火) 13:49:44.76ID:2ekPMyol>>44 新しいものって現行規格に従っただけで馬鹿呼ばわりか? ブーメランだろ 何を基準に新しいとか古いとか言ってるの? 俺に言わせりゃK&R1で憶えた立場からはC89でさえ新しいんだが 0048デフォルトの名無しさん2020/10/13(火) 13:52:16.91ID:jGpIs/AO>>46 Ruby, Perl, Python, JS, BASIC のどれでも、配列の処理範囲を示すのに 個数のパラメータを持っている。C言語でも、memcpyやmemcmpは、 memcpy(ptr1, ptr2, num) memcmp(ptr1, ptr2, num) であった。 numは、ptr1, ptr2 に共通の要素数なので1,2に対称性があり、とても分かり易いが STLの流儀に倣って書き直すなら memcpy(fisrt1, btm1, fisrt2, num) memcmp(fisrt1, btm1, fisrt2, num) となってしまうだろう。 この場合、btm1は「1」の終端であるが、「2」とは関連が分かりにくく、 「対称性」が失われている。 だから汚く見える。 0049デフォルトの名無しさん2020/10/13(火) 13:54:08.20ID:2ekPMyol>>45 C++使いの生理反射が消失してるな 不等号気持ち悪くないの? 0050デフォルトの名無しさん2020/10/13(火) 13:55:47.45ID:2ekPMyol>>48 copy(first1, last1, first2) な 0051デフォルトの名無しさん2020/10/13(火) 13:56:07.20ID:jGpIs/AO>>45 速度効率をさらに高めたいなら、 void fill(int *top, int n, int val) { int *ptr = top; int *btm = top + num; while(ptr < btm) *ptr++ = val; } と書いても良い。 なので、fill()の内部的な処理効率自体はいくらでも速くできる。 問題は、fill()を使う側の利便性や分かり易さや対称性(=美しさ)。 0052デフォルトの名無しさん2020/10/13(火) 14:11:21.12ID:alJhtdGu>>47 文盲? 0053デフォルトの名無しさん2020/10/13(火) 14:14:12.35ID:2ekPMyol>>51 void fill(int* first, int* last, int val) { while (first != last) *first++ = val; //nがなきゃtop+nなんて計算そもそもいらん } 呼び出し側でfill(first, last - first, val)なんてやられた日にゃ引いてから足し直すことになるだろ 0054デフォルトの名無しさん2020/10/13(火) 14:19:38.29ID:FpFGKRx+ これはダメなんか遅いんか void fill(int *first, int *last, int val) { while(first != last) *first++ = val; } 0055デフォルトの名無しさん2020/10/13(火) 14:44:57.22ID:jGpIs/AO>>53 >呼び出し側でfill(first, last - first, val)なんてやられた日にゃ引いてから足し直すことになるだろ