C++相談室 part140

■ このスレッドは過去ログ倉庫に格納されています
2019/01/13(日) 05:56:22.70ID:9RrR7Arz
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/02/03(日) 20:14:23.95ID:s/ZudwPt
意味なんでどうでもいいし
よく使うものは短くあるべし
484デフォルトの名無しさん
垢版 |
2019/02/03(日) 20:39:58.91ID:OlGWTuPH
>>483 この人アカン人。
2019/02/03(日) 20:43:45.32ID:yzIWridw
そしてすべてがグローバル名前空間に・・・
486デフォルトの名無しさん
垢版 |
2019/02/03(日) 20:51:16.38ID:14RUg1W9
Excel方式でA1、A2ってつけていけばよい。
2019/02/03(日) 20:58:26.26ID:/SCtje8J
std::XXX程度ならusingなどいちいちせずに毎回std::XXXと書くわの意味
2019/02/03(日) 20:59:27.30ID:JIYTTgNa
今はusingでエイリアス使うことだってできるんだし、定義側はある程度長い名前つけておいたほうがいいだろ。
489デフォルトの名無しさん
垢版 |
2019/02/03(日) 21:48:13.84ID:7BX8k8w8
namespace longlongnamespace{
struct hogehogename{
};
}

namespace untarakantara{
//長すぎる
void test(const longlongnamespace::hogehogename* lhs);
}

上のようにuntarakantaraという名前空間でライブラリを作成するときに長い名前空間だとうざったい。


//この場合usingで取り込むのが正解?
//ライブラリなんだから名前空間まで含めてすべて明記すべき?
namespace untarakantara{
using longlongnamespace::hogehogename;//1
void test(const hogehogename* lhs); //1

void test(const longlongnamespace::hogehogename* lhs);//2
}

//std::filesystemやstd::chrono等を想定
2019/02/03(日) 21:50:58.54ID:mcfLKNvL
ヘッダには長いのをそのまま書いて実装でusing namespaceすればいいじゃん
491デフォルトの名無しさん
垢版 |
2019/02/03(日) 21:59:39.14ID:14RUg1W9
>>490
ユーザーに無駄な手間をかけさせるな。
2019/02/03(日) 22:00:19.11ID:Dsz5FlLI
>>482
性感染症(STD)は、必ずしも自覚症状があるとは限らない病気です
2019/02/03(日) 22:49:53.04ID:t4xt++Qj
>>482
STD:
爆薬に直接に圧力が加わった場合に誘爆すること
2019/02/03(日) 23:52:42.87ID:JIYTTgNa
>>491
必要な手間だろ。
名前バッティングさせる方がよっぽど無駄な手間だわ。
2019/02/04(月) 00:38:59.33ID:crpI56wI
ヘッダファイル(.h)では全体を
namespace longlonglongname { ... }
で囲い、ソースコード本体(.cpp)では冒頭で
using namespace longlonglongname;
としておけば幸せになれるかもしれん…
(開発側はlonglonglongnameを2箇所だけ書けば済むし、3行コメントアウトしたらいつでもlonglonglongnameネームスペースを外せる

べつにソースコード本体の側もnamespace longlonglongname { ... }で囲っても良いが
2019/02/04(月) 00:56:22.60ID:RjHPX//j
>>494
>>479
2019/02/04(月) 08:09:08.83ID:8DX2Gc+T
今ならエイリアスでいいだろ。
usingでnamespace全体持ち込むのはdeprecatedにしてもらってもいいくらいだわ。
2019/02/05(火) 03:18:17.76ID:HIaY+PNB
以下のテンプレート関数が
template <typename T, typename U, int E>
static constexpr T f<E>(const T x, const U y) noexcept
{
return Class<T, U>::f2<E>(x, y);
}

以下のようによびだせないのは何故ですか?
f<3>(x2, y2);
2019/02/05(火) 03:46:47.46ID:VmiK9YL/
>>498
???
どうして出来ると思ったのかわからない。
2019/02/05(火) 03:50:25.51ID:HIaY+PNB
>>499
すみません。一部まちがえました
×static constexpr T f<E>(const T x, const U y) noexcept
○static constexpr T (const T x, const U y) noexcept

これでTとUが引数から引数から推論されて、Eは余っているから明示指定で大丈夫だろうと。
そう思いました。(間違っているようですが。
2019/02/05(火) 03:51:46.67ID:VmiK9YL/
>>498
そのコードを書いてある通りに解釈しようとすると、
f という関数テンプレートの部分特殊化なんだけど、
非メンバ関数の部分特殊化は出来ないし、
f<3>(x2, y2); という使用形式に合致しない。
2019/02/05(火) 03:53:36.88ID:VmiK9YL/
>>500
出来る要件に合致しないとしか言いようが無いので、
そこらへんはきちんとルールを見てもらうしかしょうがない。
2019/02/05(火) 04:02:28.79ID:HIaY+PNB
>>502
書き換えることはできませんか?
Class f2 をいちいち書くのは面倒ξんです。。
2019/02/05(火) 04:09:09.24ID:VmiK9YL/
>>503
テンプレート引数の順序を変えるだけでいけるよ
2019/02/05(火) 13:12:17.63ID:DfuuHrrH
多重ループを抜けるのに例外投げるのってあり?
2019/02/05(火) 13:16:04.40ID:VmiK9YL/
>>505
goto の方がマシ
2019/02/05(火) 13:18:19.94ID:4twphg+x
気兼ねなくgoto使えるチャンスだぞ
2019/02/05(火) 14:17:13.53ID:X+ZOJjRh
goto で多重ループ抜けたとして、ラベルの下には文がなきゃいけないわけだが、何もしたくないときはどんな文を置くの?
2019/02/05(火) 14:20:01.31ID:FmL0gboT
そんなもん 0; でいいじゃん
2019/02/05(火) 14:30:41.39ID:4twphg+x
セミコロンだけでおk
2019/02/05(火) 14:59:34.72ID:VmiK9YL/
>>508
することがなんもないならそのまま return すればいいんじゃね?
2019/02/05(火) 15:12:13.92ID:VmiK9YL/
ところで、多重ループの内側から直接 return するよりは
goto で抜けてから return する方が綺麗かなって私は思うんだけど、
皆の美意識的にはどう思う?
2019/02/05(火) 15:21:55.39ID:3J1ruy+d
抜けた後何もしないのなら、その場でreturnの方が分りやすい
514デフォルトの名無しさん
垢版 |
2019/02/05(火) 15:32:50.28ID:dQJUt0gZ
>>504
横からだけどなるほどありがとう
2019/02/05(火) 16:45:37.41ID:nhJ4ZZtC
>>511,513
すみません、「何もしない」ではなく、「数層上のループに戻る」というのが言いたかったことです

5重ループがあったとして、その中で、ある条件を満たしたら以降の処理はスキップして2重目のループを続ける、ということです


>>509-510
セミコロンだけで良いのですね
ありがとうございます
2019/02/05(火) 17:32:41.77ID:paZD+duB
NEST3:
}
NEST2:
}
NEST1:
}
2019/02/05(火) 17:34:39.81ID:FmL0gboT
個人的にはそのケースは各ループにbreak条件決めて戻るべきだと思ってるけどね
2019/02/05(火) 17:51:19.55ID:ttk98JAj
>>515
内側の二重?ループを関数にして素敵な名前を付けてください
そしてループ中に条件を満たしたらreturnすればいいでしょう
2019/02/05(火) 18:50:04.11ID:nhJ4ZZtC
>>518
ハ?笑
なんでそうしなきゃ駄目なの?

「returnで抜けたい」に引っ張られちゃってんじゃんダサ!笑
2019/02/05(火) 18:57:45.76ID:ttk98JAj
>>519
責務を関数に切り出すのさ
脱初心者したいならあなたも関数の使い方を覚えるべき
2019/02/05(火) 19:59:18.98ID:IbtcjqwQ
結局、関数をまともに書けというプログラムの真髄に到達する。
2019/02/05(火) 20:18:48.97ID:jcSIAavk
つCOBOL
2019/02/05(火) 20:27:12.09ID:S2UV61Jd
関数を書くのがプログラムの真髄w

基本中の基本だろうがw
真髄w
2019/02/05(火) 20:32:17.06ID:4ASLK4cx
>>512
私は、スタックが穢れない方法ならば、直接 return もあり、という美意識です
例外は断固 sjlj で実装すべきだと思っています
2019/02/05(火) 20:58:34.40ID:qTZt50kC
処理を関数に切り出すとそれまでローカルだったものがグローバルな世界に曝け出されるのが
ちょっと気持ち悪いと思うことがある。
pascalみたいなローカル関数が定義できるといいんだけどね。
526デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:01:56.73ID:g0g9sCQz
>>525
ローカルクラスをファンクタにするのは?
2019/02/05(火) 21:12:38.61ID:FmL0gboT
ぶっちゃけ再利用しないものは関数化しない
2019/02/05(火) 21:23:59.05ID:4twphg+x
プログラム自体が関数だしな
529デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:39:46.18ID:YX6xJwJ1
精々2重ループまでしか書かない。
3重超えるときは、前処理で跳ねるわ。
530デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:50:04.80ID:YX6xJwJ1
>>525
Pimpl, 関数のスコープ内にクラス定義できるし、ラムダ式もある。
2019/02/05(火) 22:03:16.15ID:B24ls1Z9
クラスって全部ファンクタでいいよね
2019/02/05(火) 22:17:00.68ID:ttk98JAj
>>525
どうしてグローバルになると思った?
まずその認識から直したほうがよさそうだ
2019/02/05(火) 22:41:27.49ID:XWcjjk28
そりゃ素朴にやればヘッダに書くことになるからだろ
つっこむところか?
2019/02/05(火) 22:58:22.32ID:IbtcjqwQ
>>523
基本が真髄です。
まあ本当に当たり前のことが当たり前にできないプログラマなんて腐る程いるよ。
2019/02/05(火) 23:20:37.88ID:ttk98JAj
>>533
ヘッダに書くとグローバルの繋がりは無いぞ
可視性について調べてごらん
536デフォルトの名無しさん
垢版 |
2019/02/05(火) 23:30:36.12ID:g0g9sCQz
やだなあ冗談やんけ。
そんなお尻真っ赤にして怒るなよ。
2019/02/05(火) 23:55:24.87ID:J4pnNQ65
>>516
ラベルの次には文が要る(「;」で良いが

>>533
多分クラスXのメソッドX::Foo()をX::Foo()と関数bar()に分けるとしたら、
bar()がXとは直接関係を持たない関数になってXのメンバに簡単にはアクセスできなくなるか、
あるいはbar()をXのメソッドにせねばならいという面倒が生じる
と感じる…
2019/02/06(水) 00:00:34.27ID:xEjOz3Cc
bar()が独立した関数とするにふさわしい他との依存性が小さい処理内容なら別に分けても良いが、
フローの見かけを簡単にしたいという目的で>>520式の切り出しを乱発したらたちまち債務超過に…
2019/02/06(水) 00:07:33.57ID:8+AMOzIa
>>538
フローの見かけを変えたいなどというつまらない目的では無い
責務の切り出しだと最初から言っとるだろーが
責務を適切に見極められないから5重ループなんていう悪魔的なコードを平気で書いちゃうんだよ
2019/02/06(水) 00:14:56.50ID:8+AMOzIa
>>537
メソッドでいいんだよ
めんどくさくねえよ
5重ループのほうが扱いメンドクセーって
2019/02/06(水) 00:18:52.55ID:xEjOz3Cc
5組の集合の総当りとかなら5重ループで書くのがいちばん自然で速い
n組の集合の総当りとか可変になってくるなら数え上げのアルゴリズムを変える
どっちにせよ関数を増やすことは必須ではない
2019/02/06(水) 00:27:22.81ID:8+AMOzIa
内側のループで明らかに何らかの判断を行ってその結果を外側のループが利用してる
ここで行ってる何らかの判断が責務に該当するわけだ
ならばそれをメソッドの切り出して何をしてるのか明らかな名前を付けてやればいい
プログラムってのはこうやって書くんだぜ
もしこれをメソッドにしなければ何らかの判断をすることとその結果を見て何かすることという複数の責務がメソッドに割り当てられたダーティなプログラムになってしまう
2019/02/06(水) 00:33:36.55ID:xEjOz3Cc
>内側のループで明らかに何らかの判断を行ってその結果を外側のループが利用してる
外側の債務を肩代わりする内側への資金供与はどうするんじゃ…
事実上の5重ループのもっとも内側(もっとも数多く繰り返し実行される)で、事実上引数が5個あるも同然の関数をもっとも数多く繰り返し実行するのか…

ループ構造をのまま関数の構造に変換するのはあんま筋のいいアイデアではないと思うワケ
第一なんか変更があったとき直しにくい
2019/02/06(水) 00:36:02.10ID:AKR+nTaH
そりゃコードレベルで考えてるからだろう
意味を考えずにコードだけをこねくり回すから後で変更が入るんだよ
意味のある単位で関数化しろ
2019/02/06(水) 00:37:56.91ID:xEjOz3Cc
意味を考えれ、という為らば過度の多重ループは数え上げのアルゴリズムを変えた(>>543)方が…
2019/02/06(水) 00:39:50.29ID:8+AMOzIa
>>543
いつになったらループ構造を関数化しただけって勘違いを止めれるんだ?
責務で分割ってなんどいえばわかるんだろな君は
2019/02/06(水) 01:10:17.64ID:TluxhF2l
深いネスト書くやつと長い関数・クラス書くやつはダメプログラマ
2019/02/06(水) 01:14:36.80ID:LZQuj/e3
わしらじじいの時代は関数ごとに1ファイルの.cに分けて書け、と言われたもんじゃった・・・
・・今考えたらアホやな
2019/02/06(水) 01:14:44.26ID:ynCNotXu
関数型言語だとループ使わねえもんな
2019/02/06(水) 01:19:14.37ID:TVvP4aoc
全部ファンクタにしてループを抹消しよー
2019/02/06(水) 01:54:02.43ID:1PkYZi2l
C++の殆どのコンパイラはループ自体の最適化はそこそこイケるけど再帰のループへの最適化は多用できるほど強くはない印象ある
functorがマイブームっぽい人が見受けられるけどC++2aに期待かねぇ
552デフォルトの名無しさん
垢版 |
2019/02/06(水) 02:10:57.61ID:tVubCuJx
抽象化してアルゴ切り替えとか便利だし>ファンクタ。
ループ抹消は新興宗教だわ。
2019/02/06(水) 02:17:29.94ID:3iJRb7MF
C++自体もはや宗教だろ
2019/02/06(水) 05:02:26.66ID:e/w8DpDR
>>527
これ

「ループを関数として切り出せ」とか言ってる奴は身障やな!
2019/02/06(水) 05:06:05.76ID:e/w8DpDR
あと、明らかに「5重ループ」は例えに過ぎないのにここに引っかかってる奴も完全バカ
2019/02/06(水) 07:00:55.30ID:2YrOaQLS
現実のプログラムを書いたことがない奴が机上の空論言ってるんだよね

5重ループのループ変数を外側からijkmnとして
jとkとnを使ってXを計算して
iとjとnを使ってYを計算して
XとYの比較と、kとmとnを使った条件式で分岐して
一方ではXとYとiとnを使った処理をして結果をnのレベルで宣言した配列に入れる
他方ではXとYとjとkとmとnを使った処理をして結果をmのレベルで宣言した別の配列に入れる
そして2つの配列でなんやかんやして結果をさらに別の配列に入れて以下省略

無理矢理分ければ変数と配列のポインタを大量に取る醜くて意味不明な物にしかならない
関数とは「計算」や「処理」や「なんやかんや」を切り出すものであって、ループ構造を破壊して読みにくくするためのものではない
これは現実の例だ
2019/02/06(水) 07:42:14.42ID:PYjwZV54
5重ループで必死過ぎ
2019/02/06(水) 08:42:11.48ID:dLN9y6Lw
まさに関数使うべきところじゃね?
2019/02/06(水) 09:25:14.44ID:TVKvnrTY
関数に切り出すのは再利用するためだけじゃない
読みやすいコードにするためにも超重要
これが身に染みてわかるようになったら脱初心者
わかってないやつは優れたオープンソースのコードとかもっと読め
五重ループなんてまぁプルリクでrejectされるさ
もちろん捨てコードならどうでもいいけど
2019/02/06(水) 12:16:09.08ID:gpBlA5Jy
エディタ次第だけど関数化するくらいならブロックに入れてたたんでおけばよくね
2019/02/06(水) 12:29:59.92ID:1tCLVB4W
本質的に五層の繰り返し構造をとる処理は五重のループで書くのが正しいんだよ
外側の二層と内側の三層が意味的に分かれてるなら、そりゃ関数に切るのは当たり前だし正しいさ
しかし互いに絡み合った五層繰り返しを行うアルゴリズムは、そのありのままの姿をコードに落とすべきなんだよ
そういうものを見かけのループ階層を減らすために強引に切り刻むの行為はリファクタリングではなくスパゲッティ化と言うんだ
絶対にやってはいけない
2019/02/06(水) 12:33:42.12ID:5DsLQSpR
ケースバイケース
>>541みたいな例なら5重ループの方がいいだろうし各ループの意味付が違うなら関数化もあり
>>559みたいに関数でないとダメとか言ってる自称初心者卒が一番使えない
2019/02/06(水) 12:37:20.54ID:gjOdQxAx
>>561
ループの抽象化というのは貴方が思っている以上に至るところで行われている
数えてみたらいいが、何気なく書いていたコードが意外に深いループにネストされていたというのは珍しくない
2019/02/06(水) 12:40:59.66ID:CtZpHCTy
絡み合った層ってそれほんとに層なの?
2019/02/06(水) 12:47:26.83ID:gjOdQxAx
糞をいくら切り刻んでも糞
それでいいだろもう
2019/02/06(水) 14:09:03.30ID:9JAqyHM+
cppコーダーのコードは汚い。5重ループとか平気で書く無神経さ
一回でいいからJavaやC#、ruby、などクリーンな言語を学んだほうがいい
2019/02/06(水) 14:13:54.24ID:QvJUH+Yd
ΣΣΣΣΣ
と書く代わりに
Σ_{i,j,k,lm}
と書けってか?
どーでいい
議論するだけ無駄だろwwww
C++にとって可読性なんてもはや関係ない
2019/02/06(水) 14:17:48.99ID:2YrIvpU1
そして過度にLinqを使いまくって遅くなるのでした
569デフォルトの名無しさん
垢版 |
2019/02/06(水) 14:35:47.42ID:tVubCuJx
正規化されたDB使うかな、ガチの5重ループやるなら。
計算量O(log n)~O(n)位を目安にシステム設計する。
570デフォルトの名無しさん
垢版 |
2019/02/06(水) 15:30:17.65ID:kcXvzDdu
>>567
いや
そこは
ΠΠΠΠΠ
やろ
2019/02/06(水) 16:16:53.27ID:QvJUH+Yd
>>570
マジレスしようか?
5重ループも重ねるなら、πが必要な箇所だとダイナミックレンジが大きくなりすぎる。
logとってダイナミックレンジを圧縮した後Σに変えるべきなんだよ
2019/02/06(水) 18:49:37.81ID:1tCLVB4W
>>563
コンテナを舐めて順番に処理するとか検索するとかシーケンスを比較するとか
そんなのをどんどん処理単位に切って抽象化して行くことは素晴らしいし誰も反対しないね


有害なのはループは全部そう出来るというエアプログラマーの思い込み
2019/02/06(水) 18:57:19.55ID:cXGNS95r
>>572
もっとも有害なのはごく稀な場合を引き合いに出して一般論を否定しようとするやつ
2019/02/06(水) 18:58:32.19ID:ytX3d0vu
江添さんディスってやるなよw
2019/02/06(水) 19:15:14.64ID:1tCLVB4W
ほらね
「ごく稀」というまさに思い込み
しょっちゅうとは言わないが、無視できるほど少なくもないよ
分野にもよるだろうけどさ

プログラムって結局現実の問題を解決するツールなんだから
現実世界の汚さも表現しないといけないんだよ
汚物を表すコードは汚物に見えるべきであって、見せかけで綺麗なフリしようとしたって失敗するしいいことは何もない
2019/02/06(水) 19:18:24.90ID:cXGNS95r
>>575
残念ながら全体から見れば極々稀なのだよ
偶然君の関わったとこがやりにくかっただけだろう(それか単に分析スキル不足)
2019/02/06(水) 19:27:52.65ID:JChC73Df
ID:cXGNS95rが言ってる稀ってのは、
「処理単位に切れる再利用しやすいループ」でない、依存性の強いループが稀だと言いたいのか?
2019/02/06(水) 19:33:09.12ID:Uzc23Z4W
実際のところ、5重ループってインデントが深くなる以外に何か問題あるの?
579デフォルトの名無しさん
垢版 |
2019/02/06(水) 19:53:38.31ID:tVubCuJx
五つの状態変数を把握しないといけない所。
不定のタイミングでバグが起きて、他人の書いたそれを時間に追われて読まねばならん。
2019/02/06(水) 20:06:21.69ID:cXGNS95r
>>577
単一の責務で何重にもループすることは稀と言ってる
2019/02/06(水) 20:07:36.88ID:Uzc23Z4W
それ、関数に切り出して5重ループを無くしたら解消するものなの。
2019/02/06(水) 20:08:15.91ID:cXGNS95r
するよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況