C++相談室 part153
..
67:デフォルトの名無しさん
20/10/13 17:16:38.67 jGpIs/AO.net
>>65
リストでも繰り返しなら個数でもいける。
>>63
終点ではなく、個数で渡す:
fill(dim, 100, 0); // めちゃくちゃ分かり易い。
fill(dim, dim + 100, 0); // めちゃくちゃ不便。何このタイピング量。
68:デフォルトの名無しさん
20/10/13 17:19:05.56 jGpIs/AO.net
しかも問題なのは、vectorの中ほどで追加や削除をしても、終点が自動修正されないこと。
それでは始点と終点で管理している意味が無い。
listならいけることはいけるが。
しかし、結局、vetorとlistの違いを意識しなければバグることになる。
69:デフォルトの名無しさん
20/10/13 17:25:01.13 2fTKv7IK.net
>>67
建設的な議論しようや
お前ならどう設計するか書いてみ?
70:デフォルトの名無しさん
20/10/13 17:27:25.69 jGpIs/AO.net
>>68
アイデアを盗作、剽窃しようとするなよ。
71:デフォルトの名無しさん
20/10/13 17:34:02.61 2fTKv7IK.net
はい雑魚
72:デフォルトの名無しさん
20/10/13 17:44:12.19 jGpIs/AO.net
>>70
なんのこっちゃ。
73:デフォルトの名無しさん
20/10/13 18:08:23.24 2ekPMyol.net
>>66
ズコー(aary
↓こんなコード書いたらバカにしまくってやろうと思ってたのに
#define N 100
int dim[N];
fill(dim, N, 0);
その下をいきやがったw
マジックナンバーって言葉知ってる?
74:デフォルトの名無しさん
20/10/13 18:42:42.89 f6jDEgc3.net
レベルが低すぎて議論するだけ無駄なので、この話題はこれでお終いにしてはどうだろか。
75:
20/10/13 20:06:42.81 455DutI7.net
>>41
>C++11の何が気に入らんの?
右辺値 && が……
よくわかりません
RVO 前提コードで私は妥協しているのですが
76:デフォルトの名無しさん
20/10/13 21:22:13.35 2ekPMyol.net
お気の毒に
77:デフォルトの名無しさん
20/10/13 22:22:30.85 vraeBdjb.net
よくそのレベルでSTLにケチつけられるなw
78:デフォルトの名無しさん
20/10/13 22:53:46.89 mhza1+DZ.net
>>35
×: void fill(int first[], int n, int val) //素直にこう書きやがれ
○: void fill(int first[], const int n, const int val) //素直にこう書きやがれ
79:デフォルトの名無しさん
20/10/13 23:00:47.08 1+uImEGd.net
個数不定や個数を数えるのがハイコストでも走査できたり、実在しないアドレスや好きな値でも番兵値として指定できたりするのがlast指定のifのメリットなんじゃね?
マップから取得した項目から走査したいとか、項目ごとにサイズが異なる連続データをメモリから読み出すとか、はたまたインタラクティブにユーザが終了指示するまで繰り返すとか。
個数指定のifもあれば便利だけど、どちらかを選択しないといけないなら、last指定のifだけ存在するほうがダメージが少ない
気がする
80:デフォルトの名無しさん
20/10/13 23:07:21.55 jGpIs/AO.net
>>78
もちろんそうなんだが、STLは馬鹿なので、そういう役目はほぼ果たしてない。
証拠として、途中の要素を削除してしまうとlastが全く意味を成さなくなるから。
81:デフォルトの名無しさん
20/10/13 23:26:38.01 8ZZNtI2L.net
何がどう証拠として、なのかわけが分からん。詳しく説明してくれ
82:デフォルトの名無しさん
20/10/13 23:27:15.76 SS1TQwr/.net
流れ全部読んでないけど上のほうで言ってる人がいるように
> void fill(int *first, int *last, int val)
を見た時点でCやってる人間からしたら関数内部が
> while(first < last) *first++ = val;
こう簡潔になってるだろうと想像しやすくてスッキリしてない?
別に想像する必要は無いんだけど想像してしまうというか
あと開始がポインタで終わりもポインタってのは対称的で良いと思う
> fill(dim, dim + 100, 0);
これも上記の理由により気にならない
このわずかなタイピング量すら気になるんなら
そのソースコードには多分他の問題がある
83:デフォルトの名無しさん
20/10/13 23:50:29.75 jGpIs/AO.net
>>81
>あと開始がポインタで終わりもポインタってのは対称的で良いと思う
良くないよ。
その対称性は不要。
むしろ copyするときに dstとsrcの対称性がなくなることの方がずっと問題。
なぜなら間違い易いから。
それに
fill(dim, dim + 100, 0);
と書くときも dimの部分にケアレスミスが生じ易く、たとえば、
fill(dim1, dim2 + 100, 0);
と書いてもコンパイルエラーにはならないが結果は重大である。
84:デフォルトの名無しさん
20/10/13 23:51:31.80 jGpIs/AO.net
>>82
誤: と書くときも dimの部分にケアレスミスが生じ易く、たとえば、
正: と書くときも dim + 100 の部分にケアレスミスが生じ易く、たとえば、
85:デフォルトの名無しさん
20/10/13 23:56:23.05 SS1TQwr/.net
> fill(dim1, dim2 + 100, 0);
そう間違えちゃう人は
fill(dim1, dim1 + 200, 0);
fill(dim1, dim1 + 100, 2);
fill(dim2, dim1 + 100, 0);
とも間違っちゃうから大変だね
そういう人は何より
fill(dim2, 100, 0);
の表記を使いたいんやろね
何か分かったわ
86:デフォルトの名無しさん
20/10/13 23:58:38.02 BWJh5EXt.net
全然別のコンテナのイテレータを混ぜて指定できてしまうのは確かに欠点なんだよね
だからRangeが必要だったんですね
87:デフォルトの名無しさん
20/10/14 00:11:56.45 lJFXTbVx.net
>>84
あなたの脳内にはプログラミングのセンスの様なものがまだ育ってない。
そういう人ばかりがC++委員会にいるので
「机上の空論的な設計」
と言われるようになっている。
88:デフォルトの名無しさん
20/10/14 00:20:29.03 lJFXTbVx.net
>>86
それに、先頭アドレスと長さを組にするというのは、プログラミングにおける
伝統になっていてPascal文字列やWin32のバッファの指定などもそれを
踏襲している。
topとbtmを指定する方法は番兵方式ともまた違う、STL独特の方式。
番兵方式はミスが入りにくいが、btmアドレスを指定する方式はbtmに
間違った値をしていた時にとんでも無い結果を生み、バッファオーバーラン
より酷い。
btmにtopとは全く関係の無いとんでもない値を指定できてしまうから。
配列は、0〜N-1までの分かり易い値で位置を指定できることが特徴の一つなのに
STLはそれも破壊してしまっており、範囲チェックも分かりにくくなる。
高級言語なのに、アセンブラより複雑。
アセンブラでは少しでも高速化するためにtop,btm方式が使われたこともあったが、
この高級言語の時代にはそぐわない。
分かりにくい。
89:デフォルトの名無しさん
20/10/14 00:24:28.14 lJFXTbVx.net
もっといえば、MSがグラフィックで矩形を描くときに、
左上の点と右下の点を指定する方法もセンスが無いといわれている。
これも沢山グラフィックのプログラムをしてくると
左上の点と「サイズ」を指定するのが合理的であることが分かってくるが
経験が足りて無い人には「好みの差」程度にしか認識できない。
それともとても似ている。
90:デフォルトの名無しさん
20/10/14 00:34:35.60 eS9CcskG.net
ID:lJFXTbVxが参加するレビューは荒れる…
…!
91:デフォルトの名無しさん
20/10/14 00:36:44.29 eS9CcskG.net
つか(sx, sy, width, height)式の矩形表現は
クリッピングとかしだすと結局内部で
(sx, sy, ex, ey)表現に
92:デフォルトの名無しさん
20/10/14 00:40:01.03 eS9CcskG.net
効率的な番兵法は常にアルゴリズムとともにあるから
↓こんなやつ
while (buf[i] < buf[i]) { std::swap(buf[i], buf[i]); i--; } // buf[0]はINT_MAX
範囲の一般的表現のうちに含めるのは頭おかしい
93:デフォルトの名無しさん
20/10/14 00:44:56.12 W3antmDc.net
fill(p, p + n, 0);は
fill(p + m, p + n, 0);という表現にもスムーズに拡張できる
個数の場合は
fill(p + m, n - m, 0);って書くことになるね
94:デフォルトの名無しさん
20/10/14 00:47:49.37 g6nWODwp.net
ここまで fill_n 無し
95:デフォルトの名無しさん
20/10/14 01:12:33.89 qrfIlgcS.net
>>88
なんで?中心の点とサイズなら分かるけど
ついでに言うと左上右下で矩形表現するのは重なりや画面外は見出しの判定が楽だからそっちの方が便利な場合もある
事情に応じた使い分けを考慮できないあたりが経験足りないっすねあなた
96:デフォルトの名無しさん
20/10/14 02:21:44.28 dCmiKU7l.net
>>41の
>range-based-for-statementの見た目からは驚かされる簡潔さなんかクールだろ
これに対して
>>55の
>机上の空論というか、実際のアプリ作製の経験が足りないと思われる。
>ほとんどの場合、配列の処理範囲はlastではなく個数のnumの方が便利。
ここには同意する
実際問題、STLあるいはそれに倣ったコード以外、ソフト開発の場面で
range-basedで簡潔に済むループはそんなに無い(無理矢理書き換えることは出来るとしても)
97:デフォルトの名無しさん
20/10/14 02:44:00.29 EuYzPNma.net
てか
せっかくC++使ってんのに何故
リストの始点と終点とを別々に渡したり
リストの始点と要素数とを別々に渡したり
とかやりたがるの?
98:デフォルトの名無しさん
20/10/14 06:39:07.67 fAfIBrSZ.net
>>77
動作確認くらいしてから書けよ
URLリンク(codepad.org)
99:デフォルトの名無しさん
20/10/14 06:42:43.22 fAfIBrSZ.net
>>88
ここC++スレってこと忘れてねえか?
矩形クラス作って右下とサイズと両方使えるようにすれば済む話だろ
100:デフォルトの名無しさん
20/10/14 06:45:09.59 fAfIBrSZ.net
>>96
全要素とは限らないからだよ
101:デフォルトの名無しさん
20/10/14 06:46:30.43 fAfIBrSZ.net
fill(dim, 2, 98, 0); //引数4個
fill(dim + 2, dim + 98, 0); //引数3個
102:デフォルトの名無しさん
20/10/14 07:58:42.58 qpMvVLdo.net
>>83
ケアレスミス多いな。
103:デフォルトの名無しさん
20/10/14 08:14:56.28 eS9CcskG.net
>>97
>>97が同じ関数を定義したのだから仕方が無い
>>77は×と○は×を○に修正せよと言う意味であって書き並べよと言う意味ではない
104:デフォルトの名無しさん
20/10/14 08:25:44.48 fAfIBrSZ.net
>>102
修正せよという主張が誤っていると指摘しているんだ
intというかポインタでも参照でもない値の引数のconstは多重定義において意味を成さない
105:デフォルトの名無しさん
20/10/14 09:06:12.19 +cbHRaf/.net
完全に初心者のイチャモンで、他の言語も使えて無さそうだから、何か一つやり遂げてみたら良いと思います。
106:デフォルトの名無しさん
20/10/14 09:18:06.97 fAfIBrSZ.net
具体性のない、更には漠然としすぎて一体何の話かわからんことしか言えないやつこそ初心者だろうが
107:デフォルトの名無しさん
20/10/14 09:31:01.91 eS9CcskG.net
>>103
関数内で修正しない変数にconstをつけよという当たり前の話、
C++ではCよりも関数引数についてもやりやすくなっているからやったら?
という話ェ、
108:デフォルトの名無しさん
20/10/14 09:31:55.45 eS9CcskG.net
訂正orz、
×: 修正
○: 値を変更
109:デフォルトの名無しさん
20/10/14 09:39:06.95 aLuhanwR.net
int引数にconst付ける意味ってなんですか?
値渡しされるのだから関数内で値が更新されても呼び出し元には関係ないこと(関心がないこと)だと思えますが
110:デフォルトの名無しさん
20/10/14 09:42:59.50 eS9CcskG.net
>>108
>呼び出し元には関係ないこと(関心がないこと)
左様
呼び出し元に見せる宣言文では値渡しのconstは外して良い
C++ならそれができる
Cではできない(constをつけるとしたら定義と宣言の両方に付けねばならない
111:デフォルトの名無しさん
20/10/14 09:43:23.77 lJFXTbVx.net
>>92
あなたは経験不足だからどちらの方が便利かが分かって無い。
どちらの方式も互いに単純変換できるが、現実のアプリにおいては個数の方が
便利だと言っているのだが、あなたにはそれが分からない。
そういう人達がC++委員会に多くなってきているからC++の仕様が変になって
きていると言われているのだよ。
112:デフォルトの名無しさん
20/10/14 09:45:58.36 lJFXTbVx.net
>>100
>fill(dim, 2, 98, 0); //引数4個
これは違う。
インタプリタ言語ではこのようになってしまうが、伝統的にはCでは、
fill(dim +2, 98, 0); //引数3個
と書ける。
113:デフォルトの名無しさん
20/10/14 09:50:15.45 fAfIBrSZ.net
>>111
うわー・・・俺が示したコードが読めてないな
おまえのコード、意味違ってるんだけどw
114:デフォルトの名無しさん
20/10/14 09:52:34.69 eS9CcskG.net
ていうか>>91まつがえた。n_、
正: while (buf[i-1] < buf[i]) { std::swap(buf[i-1], buf[i]); i--; } // buf[0]はINT_MAX
アウチ、
115:デフォルトの名無しさん
20/10/14 10:09:01.38 lJFXTbVx.net
>>90 >>94
それはクリッピングする場合のみだ。
しかし、いまのグラフィックライブラリはクリッピングは基本的に自動化されているので
クリッピングをアプリプログラマが自分で行う必要がある頻度はとても低い。
そういうことが優先順位ということ。
ライブラリの良し悪しは優先順位の高い作業が楽に書けるかどうかで決まる側面がある
から経験不足の人は優先順位が分かって無いので良いライブラリはなかなか作れない。
116:デフォルトの名無しさん
20/10/14 10:31:42.62 Z4l68xx0.net
ライブラリの良し悪しは俺様の流儀に従っているかどうか、まで読んだ
117:デフォルトの名無しさん
20/10/14 10:52:50.19 fAfIBrSZ.net
>>106
全然当たり前じゃねえよ
値引数にconstはつけねえんだよ
周り見てみろよ
周りがあればの話だが
118:デフォルトの名無しさん
20/10/14 11:20:31.96 fAfIBrSZ.net
>>111
待ってるんだけど返事がないね
fill(dim +2, 98, 0);
これでどうやって&dim[98]を知り得るの?
119:デフォルトの名無しさん
20/10/14 11:38:41.41 +cbHRaf/.net
「個数のほうが便利で現代的で洗練されている」と言ってる人は、STLが何故このような設計になったのか、全く理解していないので
、公共の場で主張するのはよくないのでは?
120:デフォルトの名無しさん
20/10/14 11:43:45.06 RddNL28g.net
STLは何故このような設計になったか教えて
121:デフォルトの名無しさん
20/10/14 11:44:04.35 dCmiKU7l.net
>現代的で洗練されている
誰がそんなこと書いてんだ
てか現代的とか洗練とかアホかと
なぜそうなっているか理解出来てないのはお前、D&Eの日本語版にその辺の話は載ってるから読んでこい
122:デフォルトの名無しさん
20/10/14 11:53:23.30 fAfIBrSZ.net
標準を盲信しろとは言わない
おかしいと思うことはおかしいと言っていい
いい、つーか歓迎で議論には付き合う
「議論には」な、感情論だの押しつけだの
そういう見苦しいのは相手せん
123:デフォルトの名無しさん
20/10/14 12:09:10.96 lJFXTbVx.net
>>117
あなたが何も書いてなかったから、98は個数だと認識して書いた。
もし、btm要素であるなら、
fill(dim + 2, dim + 98, 0);
と書く
124:ことになるが、このような btm 要素を指定する書き方が現実的な アプリではコーディング的に非効率な問題のある書き方だと昨日から主張し続けている。
125:デフォルトの名無しさん
20/10/14 12:15:37.74 lJFXTbVx.net
>>122
なぜかといえば、現実の大規模アプリでは配列の先頭の名前は、もっとずっと長く、
たとえば、aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx
のようになっていることが多い。それで昔ながらの C スタイルであれば、
fill(aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx, 個数, value);
と書けば済むのに、STLスタイルだと、
fill_stl(aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx,
aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx + 個数,
value);
のように複数行で書かないといけないハメになってしまう。
そして、aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxxに似た
aXxxxXxxxXxxxXxxxXxxxXxxxYyyyXxxx
というような他の変数もあることが多く、そうなると、
fill_stl(aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx,
aXxxxXxxxXxxxXxxxXxxxXxxxYyyyXxxx + 個数,
value);
のように書き間違えてもコンパイルエラーにならないので非常に重大な問題を巻き起こす。
また、少し修正したい場合、topとbtmの両方を修正しなくてはならないのに、
どちらか片方の
aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx
だけを
aXxxxXxxxXxxxXxxxXxxxXxxxYyyyXxxx
に書き換えてしまって変数名が長いので気づきにくくてどこでバグが入ったか分からない
重大な問題が入り込んでしまうことが有る。
その点、昔ながらのCスタイルではこのような問題が起きないので安全。
126:デフォルトの名無しさん
20/10/14 12:20:41.76 GsUUoEHv.net
なるほど一里塚
127:デフォルトの名無しさん
20/10/14 12:23:42.24 fAfIBrSZ.net
>>123
只でさえ長い識別子に名前空間だのスコープだのテンプレート引数がついて読む気なくさせるようなのはよく見かけるね
そういうのはusingでエイリアス作ったり左辺値参照でスコープを狭めたりで対応するのがよくあるケース
auto first = aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx.begin();
auto last = aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx.end();
とでもやっとけば楽になるのもある
昔ながらのCやC++98にしがみつくのをやめてC++11〜17の新機能を有り難く頂戴することで
色んなストレスから解放される
128:デフォルトの名無しさん
20/10/14 12:40:03.79 ssGc8zMA.net
>>123
「個数」で誤魔化されてんな
個数でもこうなるんじゃね
fill(aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx, aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx.size(), value);
129:デフォルトの名無しさん
20/10/14 12:52:15.34 lJFXTbVx.net
>>126
それは経験的にならないことが多い。
なぜなら、個数は配列自体が覚えているだけでなく、何らかの変数に入っている事がとても多いから。
典型的には、個数はマクロ変数やconst int変数などに入っているか
または、ファイルから読み込んだ場合には読み込んだときの個数が
グローバル変数などに入っている。
130:デフォルトの名無しさん
20/10/14 12:55:51.73 lJFXTbVx.net
>>127
それから、
>fill(aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx, aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx.size(), value);
の場合だと、たとえ第二引数の部分に間違いがあってもバグの程度がまだまし。
なぜなら、xxx.size()は個数なので間違いがあってもデバッガで見てもまだ分かり易いバグとなるし、
バッファオーバーランしても個数なのでどこかで停止してくれる。
ところが、btm要素方式の場合、書き間違えてbtm要素が全く別の配列の中を指してしまっている場合には
バッファオーバーランが停止することなくほぼ無限に続くことになる。
131:デフォルトの名無しさん
20/10/14 13:02:09.57 ssGc8zMA.net
つまりずっと配列前提の話をしてたワケ?
そりゃ旧来的な書き方の方が合理的だ
配列とその個数のデータ構造なら明らかにdefineされてる個数を与えた方がラクになるな
132:デフォルトの名無しさん
20/10/14 13:02:59.84 tpi9enQu.net
stl以前にエディタもまともに使えないって
133:デフォルトの名無しさん
20/10/14 13:04:53.29 lJFXTbVx.net
>>128
さらに、その場合、全要素を対象にしているから専用の関数などや
for each文などで対応できる。
一方、良くある例として、あるところから10個の要素に対して処理したい
などというものがある。
それは例えば、エディタを作っている場合に画面内に10行表示されていることが
分かっている場合だ。
そういう場合に、C流だと
draw_lines(&aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx[top], 10);
で良いのに対し、STL流だと
draw_lines(&aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx[top], &aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx[top + 10]);
ととても長くなる。
134:デフォルトの名無しさん
20/10/14 13:05:56.40 lJFXTbVx.net
>>129
STLはリンクリストではなく、(動的)配列を推薦しているから。
135:デフォルトの名無しさん
20/10/14 13:11:45.84 lJFXTbVx.net
>昔ながらのCやC++98にしがみつくのをやめてC++11〜17の新機能を有り難く頂戴することで
>色んなストレスから解放される
同意しかねます。
136:デフォルトの名無しさん
20/10/14 13:20:20.16 ssGc8zMA.net
>>131
にしてもdefineされてる配列の個数の名前もお長いんでしょ?
#define A_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_SIZE (100000)
#define A_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_YYYY_XXXX_SIZE (100000)
***
今度は
137:「個数」の代わりに「10」になってる 行数を受け取る変数名もやっぱり長いんじゃなくて? 肝心のところを短く書いてるから、短く見える こういう変数になるんじゃないのかな const int aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx_Lines = get_draw_lines();
138:デフォルトの名無しさん
20/10/14 13:22:47.51 EoVZjJO9.net
よくこんなくだらないことに熱くなれるな
139:デフォルトの名無しさん
20/10/14 13:32:19.34 +cbHRaf/.net
STLは設計のお手本的な部分があり、誰もが良く学ぶべきだけど、今回の事例で初心者がどう感じるのか、データが取れたのでは?
140:デフォルトの名無しさん
20/10/14 13:34:00.13 lJFXTbVx.net
>>134
その様な場合でも、
C流:
draw_lines(&aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx[top],
numXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx);
STL流:
draw_lines(&aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx[top],
&aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx[top + numXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx]);
となりC流の方がまだまし。
それとC流だとハンガリアン記法で名前を付けて置けば、なんとかなってる。
STL流は最悪で、非常に危険な書き方。
141:デフォルトの名無しさん
20/10/14 13:34:55.35 HhRPmWpc.net
初心者は「ぼくちんのコードが長くなるからこの設計はクソ!」と言いがちなことが分かったので今後の教育の時に注意しようと思いました
142:デフォルトの名無しさん
20/10/14 13:35:10.63 lJFXTbVx.net
>>136
ちなみにどっちが初心者だと考えているのか。
こっちはプログラミングのエキスパートだが。
143:デフォルトの名無しさん
20/10/14 13:35:22.62 +cbHRaf/.net
引数に個数を指定するほうが洗練されていると初心者が言うけれど、設計の観点から言えば、事前に個数がわからなくても呼び出せるほうが汎用性がある。
つまり、ジェネリック。
144:デフォルトの名無しさん
20/10/14 13:37:07.37 +cbHRaf/.net
STLごときでつまずいてたら、関数型なんかさっぱり理解できないだろな。
145:デフォルトの名無しさん
20/10/14 13:40:26.69 +cbHRaf/.net
2chだった頃、このスレでもプッシュ型インターフェースが流行りかけてたんだよな。
5chになって若干質が落ちたんじゃないだろか。
146:デフォルトの名無しさん
20/10/14 13:41:57.79 HhRPmWpc.net
初心者くんはこの世の全ての範囲のendが「先頭からの個数」で決まる場合しかないと思い込んでるみたいだけど
例えばfindの検索結果とか、GUIの現在カーソル位置とかで決まる場合もあって、その場合だと本質的でない「個数」という数字を求めるコードが結局長くなってしまうことに注意しよう
簡単な練習問題だよ
147:デフォルトの名無しさん
20/10/14 13:44:01.55 ssGc8zMA.net
>>137
その配列のラッパークラスは作らんの?
148:デフォルトの名無しさん
20/10/14 13:51:26.20 Z4l68xx0.net
>>127
マクロ変数(定数?)とかグローバル変数とか生配列とか、旧態依然としたCの作法が好きなら無理にC++やSTLを使わずに自分の好きな道具を使えばいいんでないの?
今でも(そして恐らくこれから先も)変わらず使えるのだから。
自分の好みに合わないものを他人が嬉しそうに使ってるのが気に入らないの?
149:デフォルトの名無しさん
20/10/14 13:54:48.00 OK1/udlE.net
配列が個数を持ってるなら
fill(配列, 値);
で良くね?
150:デフォルトの名無しさん
20/10/14 14:08:57.43 lJFXTbVx.net
>>141
いや、数学的ならむしろSTLより理解できる。
151:デフォルトの名無しさん
20/10/14 14:35:28.55 fAfIBrSZ.net
>>146
常に全要素ならな
152:デフォルトの名無しさん
20/10/14 14:38:31.07 fAfIBrSZ.net
> こっちはプログラミングのエキスパートだが。
にーしちゃ恥ずかしいミスしてたね、さっき
fill(dim, 2, 98, 0); //引数4個
fill(dim + 2, dim + 98, 0); //引数3個
fill(dim +2, 98, 0); //伝統的にはCでは、(中略)と書ける。 ←これw
153:デフォルトの名無しさん
20/10/14 14:39:14.81 fAfIBrSZ.net
引数4個と3個の違いは有耶無耶にしたいのかな?
154:デフォルトの名無しさん
20/10/14 15:03:45.73 d5S3+KHs.net
GCC9で-std=c++2aが使えるんだけど…C++20です…これってさぁ…
実験的にサポートみたいな事行ってるけど、使ってもOKなの?
experimental supportって言ってるけど…みんなどうしてるの?
155:デフォルトの名無しさん
20/10/14 15:07:19.79 ssGc8zMA.net
>>151
「腕に自信のある奴は無償デバッグ要員になってくれ」という委員会からのお願い
見つけたバグやあやしい挙動の個数に応じて名を上げることも出来る
156:デフォルトの名無しさん
20/10/14 15:14:57.44 lJFXTbVx.net
>>149
あなた、話の流れを理解して無いですよ。
157:デフォルトの名無しさん
20/10/14 15:15:36.27 d5S3+KHs.net
C++17で行きます…17でも十分新しい…。
158:デフォルトの名無しさん
20/10/14 15:16:35.85 fAfIBrSZ.net
>>153
で、終点アドレスではなく個数にすると
引数が少なく済むの?
159:デフォルトの名無しさん
20/10/14 15:37:35.37 +cbHRaf/.net
URLリンク(isocpp.org)
160:デフォルトの名無しさん
20/10/14 15:41:12.49 lJFXTbVx.net
>>155
今回は、引数の個数は議題にはして無い。
161:デフォルトの名無しさん
20/10/14 15:45:10.45 lJFXTbVx.net
>>157
つまり「引数の個数が多くなるからSTLが問題」などとは全く言って無いということ。
別に個数方式にしても引数が少なくなると言うことではない。
引数の個数ではなく、コーディングする時の引数の記述量を減らせることが多い。
+演算子も使わなくて済むのでケアレスミスも減らせる。
またtopとbtmで重複する事を書かなくて済む。
そしてそれは安全性に繋がる。
なぜなら同じであるべきところを誤って異なるように書く可能性がなくなるから。
162:デフォルトの名無しさん
20/10/14 15:51:28.70 +cbHRaf/.net
お前の考える正しいライブラリがSTL以上に使われるなら、お前の意見にも一理あるのかもしれないけど。
ここで見た分には、初心者が使い方わからんと騒いでるだけに見える。
163:デフォルトの名無しさん
20/10/14 15:53:12.69 fAfIBrSZ.net
>>157
いやいや、100に対して111の流れは引数の個数だよ
===== 引用開始 =====
100 自分:デフォルトの名無しさん[sage] 投稿日:2020/10/14(水) 06:46:30.43 ID:fAfIBrSZ [4/15]
fill(dim, 2, 98, 0); //引数4個
fill(dim + 2, dim + 98, 0); //引数3個
111 返信:デフォルトの名無しさん[sage] 投稿日:2020/10/14(水) 09:45:58.36 ID:lJFXTbVx [5/19]
>>100
>fill(dim, 2, 98, 0); //引数4個
これは違う。
インタプリタ言語ではこのようになってしまうが、伝統的にはCでは、
fill(dim +2, 98, 0); //引数3個
と書ける。
===== 引用終了 =====
しかもだよ、これインタプリタ方式とコンパイラ方式でどんな違いが出るの?
変に逃げ回ったり139みたいなプリティ発言するほど墓穴がでかくなるだけだぜ
ミスはミスで潔く認めたほうが被害拡大を防げると思うよ
164:デフォルトの名無しさん
20/10/14 15:54:50.74 lJFXTbVx.net
>>160
逃げたりとかじゃなく、あなたの言っている意味がこちらには伝わってないから
混乱が生じているだけ。
あなたの説明は言葉が足りて無いから。
165:デフォルトの名無しさん
20/10/14 16:07:49.07 lJFXTbVx.net
>>160
>しかもだよ、これインタプリタ方式とコンパイラ方式でどんな違いが出るの?
インタプリタ方式だと必ずそうなると言う意味ではなく、arr + 2
が「3番目の要素のアドレス」の意味で使えるのは、大体コンパイラ系の言語の仕様。
その意味で、
xxx(arr + 2,...) ではなく、xxx(arr, 2,...) のように書くのはインタプリタ言語
に多い書き方だから。
166:デフォルトの名無しさん
20/10/14 16:49:10.93 fAfIBrSZ.net
>>161
いや伝わってるよ
配列と個数で渡す方式と、始点と終点で渡す方式で
引数の個数に違いが出るという100におまえさんは反応してて
しかも引数の個数を減らす例を示そうとしてた(そしてミスった)
>>162
コンパイラ方式というよりCの影響を受けた言語ってことだね
そうでない言語では配列+整数はSYNTAX ERRORかvalarrayのような話で
167:デフォルトの名無しさん
20/10/14 16:53:34.15 lJFXTbVx.net
>>163
あなたの言っていることは、理解できないので議論を終えることにします。
逃げているのではなく、意味が分からないので。
168:デフォルトの名無しさん
20/10/14 17:07:55.33 fAfIBrSZ.net
結局、配列と個数で渡す方式が、始点と終点で渡す方式よりも
優位であることを示すのを諦めたわけだね
示せるわけがないという俺の予想どおりだわ
169:デフォルトの名無しさん
20/10/14 17:14:10.14 lJFXTbVx.net
>>165
いや、十分に示せているはずなのに、このスレでは頑なに理解して貰えないだけです。
170:デフォルトの名無しさん
20/10/14 17:15:40.91 +cbHRaf/.net
「我はSTLを超える者なり!!」などと初心者が言い出してビックリしたわ。
171:デフォルトの名無しさん
20/10/14 17:32:06.99 EoVZjJO9.net
これだけくだらない問題に白熱してる時点でセンスがない
172:デフォルトの名無しさん
20/10/14 17:36:09.65 fAfIBrSZ.net
>>1
173:66 で、配列と個数で渡すことで、始点と終点より引数の個数は減ったのか?
174:デフォルトの名無しさん
20/10/14 17:37:36.44 RddNL28g.net
だよね
どの話題に食いつくかでそいつの能力がわかる
このスレの老害はどうでもいいレベルの話を延々語る
175:デフォルトの名無しさん
20/10/14 17:42:38.61 ZV1nncqg.net
>どの話題に食いつくかで
自称数学者の発想ですね判ります
176:デフォルトの名無しさん
20/10/14 17:48:04.39 4qg33D8d.net
131見るとわかるけど
コピペや置換する発想すらない人がstlの利点とか理解できるわけないし
177:デフォルトの名無しさん
20/10/14 17:55:52.69 lJFXTbVx.net
>>169
外国の人?
引数の個数が減るとは一言も言ってない。
引数の記述上の長さが減り、分かり易さや間違いにくくなるといっている。
さんざん同じ事を言っているのに、全く違うことを言ったことになってしまっている。
178:デフォルトの名無しさん
20/10/14 18:23:42.32 lJFXTbVx.net
機械翻訳して、長さと個数が混乱して訳されてしまっているのだろうか。
179:デフォルトの名無しさん
20/10/14 18:53:52.73 qpMvVLdo.net
>>147
数学で言う関数は関数型じゃないよ。
写像とか勉強したら?
180:デフォルトの名無しさん
20/10/14 19:16:14.41 fAfIBrSZ.net
>>173
> fill(dim, 2, 98, 0); //引数4個
> 98は個数だと認識して書いた。
間違いにくいとか、間違えやすいとか、
それはおまえさんの個人的なことじゃねえかよ
配列と個数で渡すのが、始点と終点で渡すことよりも
優位だというのは、おまえさん個人が間違いにくいってことか?
言うまでもないが、俺は間違えずにコード示してて
間違えたのはおまえさんだけだぞ
それを一般論として優位ということにはできんだろ
181:デフォルトの名無しさん
20/10/14 19:16:18.40 qpMvVLdo.net
この手の配列の話でrangeが出てこないのはなんで?
最近の標準には疎いけど、この手の問題のほとんどがboost::rangeで解決しない?
182:デフォルトの名無しさん
20/10/14 19:18:22.41 d5S3+KHs.net
@std::list<Path>* pathListをソートするとします…。
Aどっかのメソッドは…void sort(std::list<Path>* pathList)で受けるとします…。
B内部で以下のようにソートするとします…。
pathList->sort([](Path& o1, Path& o2) {
if(o1.getFileName().compare(o2.getFileName()) < 0) {
return true;
} else {
return false;
}
});
このときに!Aメソッドで…void sort(std::list<Path>*& pathList)
としておかないと…なんか気持ち悪いんですが…
なんで参照の値渡しstd::list<Path>*だけで大丈夫なのかメモリアドレスまでは
僕は把握してません…参照の値渡しだけで行くだろうけど…なぜ大丈夫なのか説明できません…。
誰か…。
183:デフォルトの名無しさん
20/10/14 19:19:42.63 fAfIBrSZ.net
>>174
長さと個数の混同は「先頭アドレスを渡す」って前提で起きることだよな
dim + 2という例を示したら見事に思う壺にハマるやつがいてワロタ
184:デフォルトの名無しさん
20/10/14 20:10:37.92 qrfIlgcS.net
>>178
日本語でどうぞ
185:デフォルトの名無しさん
20/10/14 20:23:03.09 j1TiW1+l.net
伝統的なバッドノウハウ
「ニワカなやつほど語りたがる」
ID:lJFXTbVxのことね
186:デフォルトの名無しさん
20/10/14 20:37:36.49 fAfIBrSZ.net
俺も本当はもっとおとなしく話すつもりだったのに
エキスパートとかプリティ発言するから予定外にいじめっちゃうのを余儀なくされたのよ
187:はちみつ餃子
20/10/14 20:49:16.68 +PdAwU8N.net
Go や Rust でスライスを言語の基本要素として取り入れたのは
ポインタでやりくりするのが (少なくとも今となっては) あまりイケてない方式
という判断があってのことなんだろうな。
188:デフォルトの名無しさん
20/10/14 20:55:00.69 j1TiW1+l.net
ポインタこそが大事
ポインタこそが肝心
Cで一番大事なのはポインタ
C++は知らん
189:デフォルトの名無しさん
20/10/14 20:55:45.47 z3Ys6y55.net
>>178
俺はお前さんの文章が「なんか気持ち悪い」よ。
話し言葉もそんな感じなのか?
190:デフォルトの名無しさん
20/10/14 21:04:32.42 EoVZjJO9.net
>>178
URLリンク(ideone.com)
std::list<Path>& pathList
でいいじゃん.なぜ
std::list<Path>* pathList
なんだ?
191:デフォルトの名無しさん
20/10/14 21:27:18.64 eS9CcskG.net
>>116
なんじゃそりゃ;;
>>116は周りが死ね言うたら死ぬんか…?
192:デフォルトの名無しさん
20/10/14 21:35:17.95 4qg33D8d.net
>>178
ポインタの値自体はコピーされるけどその指してる先は同じだから
193:デフォルトの名無しさん
20/10/14 23:24:35.72 ssGc8zMA.net
>>137
aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx[aXxxXxxXxxXxxXxxXxxXxxXxxXxxXxx_NUM]
これのラッパークラスとかは作らんの?
194:デフォルトの名無しさん
20/10/15 00:28:14.53 ecxFi3He.net
begin, lengthでなくてbegin、endになっているのは
具体的に言えばNULL終端の文字列みたいなものにでもゼロコストで対応できるからでしょ
わかりやすさ〜とかそういう感覚的なもの以前の話として、
length案は共通インタフェースを定める目的にあってない
既に上に何人かが同じ内容を書いてるけどなぜわからんかな
195:デフォルトの名無しさん
20/10/15 01:29:04.51 z3OAjGAN.net
>>ID:+cbHRaf/
>>120には言い返して来ないんだなww
196:デフォルトの名無しさん
20/10/15 06:05:35.87 qGtCPYoD.net
>>187
で、おまえさんの周りには値引数にconstつけてるバカはいたのか、いなかったのか、どっちだ?
197:デフォルトの名無しさん
20/10/15 07:48:07.21 8g5pkzoR.net
初心者はぼくちんのコードさえ短くわかりやすくなればそれでいいしそれが正しいと考えがちなので
共通インターフェースの必要性とか重要性は理解以前に想像もできないんだよね
その辺を教え込むのはたいへんだ
198:デフォルトの名無しさん
20/10/15 08:40:54.84 Rskl+IBz.net
STLは共通インターフェースの策定の失敗例。
199:はちみつ餃子
20/10/15 09:24:37.63 vnecXNks.net
配列ではポインタがイテレータとして機能するし、イテレータとしての要件を満たしてもいる。
そうなるようにデザインされたのは自明だな。
ポインタに合わせて統一したのが全面的に良いとは言えないのかもしれないが、
イテレータの枠組みに配列やポインタを含まないデザインにするというのは
C++ の立場からするとありえない選択でもあるし、
要するに「仕方ない」としか言えんわ。
200:デフォルトの名無しさん
20/10/15 14:12:18.99 kscRf0sZ.net
autoないときはイテレータめんどくさかったけど今は別になあ
201:デフォルトの名無しさん
20/10/15 14:25:43.71 btt8eLo1.net
もうautoなしでは書けんわ
202:デフォルトの名無しさん
20/10/15 15:41:54.19 qGtCPYoD.net
catch(nested_exception& nx)
{
auto C2065_p = dynamic_cast<C2065_t*>(&nx);
auto C2146_p = dynamic_cast<C2146_t*>(&nx);
auto C2653_p = dynamic_cast<C2653_t*>(&nx);
auto C2672_p = dynamic_cast<C2672_t*>(&nx);
}
203:デフォルトの名無しさん
20/10/15 17:12:09.30 lq1gR0YQ.net
lengthなんて数行で実装できるじゃんw
自分用のテンプレに入れときゃ解決w
204:デフォルトの名無しさん
20/10/15 17:13:29.26 ecxFi3He.net
std::distance
205:デフォルトの名無しさん
20/10/15 17:23:04.67 qGtCPYoD.net
ワロタ
206:デフォルトの名無しさん
20/10/15 18:27:46.64 ZxgioYKc.net
aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx
↑この時点で手遅れレベルで腐ってるのは誰も指摘してやらないんだなw
>>192
> 値引数にconstつけてるバカ
お題スレで答えてるやつにおったわ
みんなに空気として扱われてたけど
207:202
20/10/15 18:29:24.72 ZxgioYKc.net
俺は>>187じゃなくて横からね
いちおう断っておく
208:デフォルトの名無しさん
20/10/15 19:32:56.49 o1whfqB0.net
思ったほど落ちてなかった
209:デフォルトの名無しさん
20/10/15 19:51:50.58 o1whfqB0.net
>>202
手遅れだからそっとしといた
210:デフォルトの名無しさん
20/10/15 20:52:33.99 qGtCPYoD.net
>>203
はいはい横ねー
211:デフォルトの名無しさん
20/10/15 21:25:48.32 +lHmSCSK.net
エディタでは中核のデータであろう文字列の配列が
aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx
っていう名前で、しかもそれとは別に
aXxxxXxxxXxxxXxxxXxxxXxxxYyyyXxxx
みたいな、また別の文字列配列が存在する世界観なんでしょ
しかもそれぞれにどういうワケか
aXxxxXxxxXxxxXxxxXxxxXxxxXxxxXxxx_NUM
aXxxxXxxxXxxxXxxxXxxxXxxxYyyyXxxx_NUM
みたいな定数がdefineされている
それらの配列は
aXxxxXxxxXxxxXxxxXxxxXxxx_NUM
で統一されているわけではない
212:デフォルトの名無しさん
20/10/15 21:33:12.16 +lHmSCSK.net
「変数名を長くすればSTLの書き方ではとても長くなるので、STLの書き方はダメです」
と言うためだけにわざわざ作られた長い名前だから、名前が長い
ダメと言うためにわざわざ作られたダメな例なんだから、そのリクツの中ではSTLがダメなように見えるのは、彼の中では当然だよ
だってダメになるように作られたダメな例だもん
213:デフォルトの名無しさん
20/10/15 22:14:19.51 LO3W6bS9.net
頭おかしいのがまた湧いてるな
214:デフォルトの名無しさん
20/10/16 05:15:42.21 3AzgsKTP.net
値引数にconstつけてても別にいいと思うけどね
コピーで渡してなおかつconstであることを明示したいなら
むしろconstで引数渡さないって言いはるのは思考停止のバカ
215:デフォルトの名無しさん
20/10/16 06:18:41.00 y0b2R3Tf.net
同意
自分はそれ思いつつも、文法上の、狭い関数内だけでのバグ抑止以上の価値は無いだろうと考えて、やってないけど
あえてやってる人が居てもバカにしようとは思わない
216:デフォルトの名無しさん
20/10/16 06:43:39.95 5553rdQz.net
>>210
仮引数は変更しないって前提で思考停止してるのはお前だよ
void fill(int* first, int n, int val)
{
while (n--) *first++ = val;
}
関数の定義を別の翻訳単位に分離したら
それこそ定義かくやつだけの問題で
const付けろ付けるなと騒いでも他人の仕事に口出すなってだけ
おまえらと違ってこちとらおまえらごとき論破するのに侮辱語はいらねえ
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
289日前に更新/258 KB
担当:undef