C++相談室 part164

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 33da-QP0H)2023/05/09(火) 11:50:52.06ID:EYc2I7oW0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part163
https://mevius.5ch.net/test/read.cgi/tech/1672409791/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

0952デフォルトの名無しさん (ワイーワ2 FF62-6i8i)2023/10/24(火) 12:59:19.46ID:2UheMrybF
>>946
deque の方が常に良いことが多いと思う

initializer_list でうまくいかんときは
make_tuple か tie でごまかしたことがある気がするけど
あれも move じゃなくて copy だったかな

最近は Rust の方がその辺は楽な気がするな

0953デフォルトの名無しさん (ワッチョイ 5d01-46Vy)2023/10/24(火) 13:10:28.54ID:B30+3CR30
>>952
initializer_listでmoveできない問題なら>>939で良いのでは?
template化して関数名短くすれば使い心地は{}と
そう変わらんと思うが?

0954デフォルトの名無しさん (ワッチョイ 8eca-ANn9)2023/10/24(火) 22:26:14.45ID:0fDOryx60
文字コード周りだけは決着つけてくれ!

0955デフォルトの名無しさん (ワッチョイ ba48-g88S)2023/10/26(木) 08:51:51.55ID:+j1jszqL0
chatGPTが今ダウンしているので質問します
以下のC++コードでfirst->secondとなっている部分がよくわかりません
vector<pair<int, int>> A(N);
for(auto& [x, y] : A) cin >> x >> y;
unordered_map<int, int> X, Y;
for(auto& [x, y] : A){
x = X.try_emplace(x, X.size()).first->second;
y = Y.try_emplace(y, Y.size()).first->second;
}
try_emplaceはPair<iterator,bool>を返すオーバーロードがあるので
firstまではわかるもののそこからさらにsecondとすると何がおきるのでしょうか

0956はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8e3e-exru)2023/10/26(木) 09:25:01.17ID:oN20rU1J0
>>955
格納しているのがペアなんだからペアの second 側が得られるってだけ。
イテレータは operator* や operator-> をオーバーロードしていて
要素へのポインタであるかのように扱えると考えていい。

0957デフォルトの名無しさん (スププ Sd9a-Cy5w)2023/10/26(木) 22:18:49.00ID:eAGx217zd
単に入れ子になってるだけ
ポインタの先の要素がまたポインタで指してるだけ

0958デフォルトの名無しさん (ワッチョイ ba48-g88S)2023/10/27(金) 08:11:42.47ID:IlYWK5hg0
>>956-957
ありがとうございました。
iteratorを返したらそのiteratorに対してさらにsecondを呼び出しているのですね

0959デフォルトの名無しさん (ワッチョイ 5101-CP9B)2023/10/29(日) 23:41:12.89ID:JPy8qBbk0
C++モジュールについて
・CMakeが3.26で実験的対応、3.28で正式対応
・g++は対応状況が良くないが、2024年第二4半期に対応できるとKitwareは考えている
・VS2022最新版内臓のCMakeバージョンは3.26
・Clangとclはモジュールに対応している

0960デフォルトの名無しさん (ワッチョイ 13ad-c8RC)2023/10/30(月) 13:05:26.07ID:bW5EQkS/0
Cスレで話題になっててちょっと疑問を質問
自分はgotoって全く使わないで書いているんだけど実際のところどうなんだろう

https://learn.microsoft.com/ja-jp/cpp/cpp/goto-statement-cpp?view=msvc-170
「可能な限り、goto ステートメントより break、continue、および return ステートメントを使用することをお勧めします。
ただし、break ステートメントはループの 1 つのレベルのみを終了するため、深い入れ子のループを終了するには goto ステートメントを使用する必要がある場合もあります。」

俺も深い入れ子のループを抜ける方法として
・ループ部分を関数化してreturn
・breakで抜けて if(/* 抜けた理由を再度評価 */) break; を繰り返す  (※後述)
ということをしている

けどgotoで抜けるほうが楽だろうなと思うんだけど、まあ単純なバグ(プログラマーの見落とし)を除いてどういう問題があるんだろうか

for ( i = 0; i < 10; i++ )
{
 printf_s( "Outer loop executing. i = %d\n", i );
 for ( j = 0; j < 2; j++ )
 {
  printf_s( " Inner loop executing. j = %d\n", j );
  if ( i == 3 ) break; // 内側のループ抜け
 }
 if ( i == 3 ) break; // 外側のループ抜け
}

0961デフォルトの名無しさん (アウアウウー Sad5-g+2W)2023/10/30(月) 13:37:46.82ID:xnp7PI6ya
>深い入れ子のループを終了するには goto ステートメントを使用する必要がある場合もあります
って描いてあるしそれが問題とは言ってないんじゃないか

0962デフォルトの名無しさん (ワッチョイ 297c-tLJy)2023/10/30(月) 14:24:40.02ID:eEth4IuV0
とりあえずダイクストラ大先生の例の論文読もうぜ

0963デフォルトの名無しさん (ワッチョイ 13ad-c8RC)2023/10/30(月) 15:01:52.03ID:bW5EQkS/0
まあ問題あるならそもそも導入されるはずがないわけで問題ないのは分かるんだけど
「可能な限り〜お勧めします。」と言うように使用を推奨しない理由は何なのかなと
例えば特定の処理が飛ばされて動作しなくなる場合があるとかなんかな?と

0964デフォルトの名無しさん (ワッチョイ 9b91-lnbO)2023/10/30(月) 15:54:27.55ID:A0jdf3Dt0
それはrustのラベルbreakのような
安全なループの抜け方しか考えてないから安全で当たり前
c/c++のgotoはもっと凶悪なことができる

0965デフォルトの名無しさん (ワッチョイ 297c-tLJy)2023/10/30(月) 16:23:23.04ID:eEth4IuV0
C++のgotoはちゃんとデストラクタを呼んでくれるから、意外とそんなに破滅的なことにはならんのだよね
だからって多重ループ脱出以外で使おうとは思わんけど

0966デフォルトの名無しさん (ワッチョイ 8101-VINR)2023/10/30(月) 16:30:54.25ID:hnsSyQft0
俺は例外投げて脱出する

0967デフォルトの名無しさん (ワッチョイ 9b91-lnbO)2023/10/30(月) 16:35:01.03ID:A0jdf3Dt0
>>966
気軽に例外投げるとデバッガが使いづらくなるからやめときな
少なくとも仕事では

0968デフォルトの名無しさん (ワッチョイ 13ad-c8RC)2023/10/30(月) 16:40:27.98ID:bW5EQkS/0
多重ループ脱出で使っている人って多いんかな?
他にこういう使い方しているとかってない?

0969はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b3e-g5YV)2023/10/30(月) 16:45:14.84ID:I7fISnX+0
>>963
一般論としてはそのほうが分かりやすくなるからというだけのことだと思うよ。

ただ、それで分かりやすくならないとき、
チマチマした条件チェックであっちこっち行くよりは
流れをぶった切って goto したほうがいっそわかりやすいこともあるってのが
goto が必要な場面ってことなんだわ。

0970デフォルトの名無しさん (ワッチョイ 8101-VINR)2023/10/30(月) 17:14:03.48ID:hnsSyQft0
>>967
と言いますと?

0971デフォルトの名無しさん (ワッチョイ d9ab-txvC)2023/10/30(月) 17:24:30.69ID:9eqG7NVC0
ラムダ式にする

0972デフォルトの名無しさん (ワッチョイ 297c-tLJy)2023/10/30(月) 17:57:47.45ID:eEth4IuV0
>>968
自分としては多重ループ脱出がC++でのgotoの唯一の実用的な用途だと思ってる(とはいえめったに使わない)
Cなら疑似finally的な後処理に使うこともあるけど、それはC++ならRAIIにすべきだしな
それ以外の戻ったり余所のスコープに侵入したりはもちろんCでもC++でも論外

0973デフォルトの名無しさん (ワッチョイ 8114-Qq8E)2023/10/30(月) 18:39:22.51ID:VfsLhOLn0
何度も繰り返すgotoの話になると人が湧くな

0974デフォルトの名無しさん (ワッチョイ 9b91-lnbO)2023/10/30(月) 18:54:25.65ID:A0jdf3Dt0
>>970
VSのデバッガは例外投げられるとメッセージでる(設定変えればオフにはできる)
また設定によってはブレイクする
正常処理のくせに頻繁に例外投げられると非常にうざいし、本当の異常を見過ごす

0975デフォルトの名無しさん (ワッチョイ 5101-CP9B)2023/10/30(月) 19:04:07.11ID:qWSrxYwr0
switchとgoto組み合わせて状態機械作ってる

0976デフォルトの名無しさん (ワッチョイ 9b91-lnbO)2023/10/30(月) 19:54:14.15ID:A0jdf3Dt0
gcc拡張のlabelのアドレスとれるやつとかな
昔はイキって使ってたわ

0977デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 20:16:27.75ID:hnsSyQft0
>>974
そりゃうざいデフォルト設定だな
ループの脱出に限らず例外くらい普通に使うやろ?
ちゃんと切っとけ

0978デフォルトの名無しさん (ワッチョイ 9b91-lnbO)2023/10/30(月) 20:43:41.27ID:A0jdf3Dt0
>>977
例外が起こったときは何かおかしいことが起こっている予兆と考える防御的なVSをおれは支持する
だいたい例外安全って何それ?ってレベルのやつも多いだろ
例外で遊ぶのは趣味のときだけにしとけ

ループ脱出レベルで例外を使うのは変だと感じる
関数抜けないのに例外なんて…

んで大昔に例外に似た機能のFound文Match文とか妄想してたんだな

実質タダのgoto文

0981デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 20:54:46.86ID:hnsSyQft0
>>978
ループに限らず孫関数ひ孫関数からエラーで脱出するときどうしてんの?
例外使わんか?

例外は通常動作として起こらないような動作で起こすもので
何か探すループなんかで実際に対象が見つかったとしてそれは「例外」なのか?
ちがうだろー

0983デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 20:58:12.43ID:hnsSyQft0
>>979
俺はgotoは全く書かないな
パフォーマンス的にはgotoの方が良いかな?

0984デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 20:59:51.11ID:hnsSyQft0
>>982
実にくだらない理由だと思う

>>984
それが一般的な解釈でおかしな使い方をしてる人間は影で笑われている

0986デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 21:06:32.49ID:hnsSyQft0
>>985
人格を攻撃するような書き込みはやめようね

例外はパフォーマンス的に重いしそれ以前に
正常系の出力を異常系で投げるのはおかしい

まったくもって異常

0988デフォルトの名無しさん (ワッチョイ 297c-tLJy)2023/10/30(月) 21:08:57.30ID:eEth4IuV0
よその言語ではイテレータの終了通知に例外使ってたりするから人格否定するほどの話ではない
C++の慣用としてやられてないし向いてないってだけ

>>986
人格自体は攻撃してないだろ
事実

0990デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 21:12:55.48ID:hnsSyQft0
>>987
>正常系の出力を異常系で投げるのはおかしい
これを書いたのはあなたで私ではないよ

0991デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 21:14:51.99ID:hnsSyQft0
>>989
>>987の「例外はパフォーマンス的に重いし」のような議論は分かるが
>>985は人格を攻撃している書き込み
気をつけ給え

0992デフォルトの名無しさん (ワッチョイ 9b91-lnbO)2023/10/30(月) 21:19:13.29ID:A0jdf3Dt0
>>981
エラーならありだがtry catch書かされるのもだるいだろ
現実的に例外投げる場合はそのまま終了か、フルリブートするしかないときって考えたほうがいい

非常に大切で根本的な理由と例を挙げたのに「実にくだらない理由」としか取られないのが残念
例外はただの制御構文ではない

>>991
実にくだらない理由か本当に?
理解不足だと思うけど

0995デフォルトの名無しさん (ワッチョイ 1bda-9b8G)2023/10/30(月) 21:22:28.46ID:J+/7yoK80
凶悪といえばAnsiCのsetjmp()とlongjmp()
あれらを規格に入れてるのはキチガイとしか

0996デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 21:25:34.77ID:hnsSyQft0
>>993,994
そう思う

>>982
>例外は通常動作として起こらないような動作で起こすもので
これは今行っている議論の対象である

>何か探すループなんかで実際に対象が見つかったとしてそれは「例外」なのか?
何に使うかの理由に名称を持ち出すのは
私はくだらないと考えている

>>996
概念だろ
それが一番大切で実装の基本だろ

C++自体の仕様が変わるとしても例外と言う概念に沿って変わることになるはずだ
今適当にマッチを投げていて仕様がより例外側に代わってその時その使い方は生き残れるのだろうか?

0998デフォルトの名無しさん (ワッチョイ 8101-jlrJ)2023/10/30(月) 21:31:50.44ID:hnsSyQft0
>>997
templateメタプログラミングとか許せない人ですか?

0999デフォルトの名無しさん (ワッチョイ d1ad-AT6i)2023/10/31(火) 06:57:27.99ID:BIE3G76Q0
Core Guideline にも例外はエラー処理だけに使えとある.
多重ループからの脱出が本当にエラー処理なの?

1000デフォルトの名無しさん (ワッチョイ 1379-JwVi)2023/10/31(火) 07:21:48.58ID:1/1CCAX60
質問いいっすか?

10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 174日 19時間 30分 57秒

10021002Over 1000Thread
5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。

▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.net/

▼ UPLIFTログインはこちら ▼
https://uplift.5ch.net/login

レス数が1000を超えています。これ以上書き込みはできません。