C++相談室 part162

■ このスレッドは過去ログ倉庫に格納されています
1sage (ワッチョイ fbf0-ofdD)
垢版 |
2022/10/31(月) 14:29:35.57ID:J5sgTSch0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

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

※前スレ
C++相談室 part161
https://mevius.5ch.net/test/read.cgi/tech/1653135809/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/12/04(日) 17:37:18.99ID:S/+N28Tr0
>>520
> 集合型をどうにか再現
それが>>517じゃねーの?

> ビットを立てた整数を返す、可変長引数を取る関数を作れば良さそうだと思いました
そういう関数を作れば良さそうだと思います
2022/12/04(日) 17:49:59.78ID:flilPTWf0
std::bitset<256>も試してみましたが
{8, 9, 12} こういった形式単独で使えるやり方はないかと調べていました
2022/12/04(日) 18:04:56.88ID:YO7rrhiC0
std::bitset は unsigned long long を受け取るコンストラクタには constexpr が付いてるので
それより小さいビット数の bitset についてならコンパイル時に計算してしまうことも出来る。
2022/12/04(日) 18:39:41.91ID:YO7rrhiC0
たぶんやりたいのはこういう感じかな。 (想定は C++17 以上)

#include <bitset>
#include <cassert>
#include <climits>
#include <cstddef>
#include <type_traits>

template <std::size_t N = sizeof(unsigned long long int) * CHAR_BIT, class... T>
constexpr std::enable_if_t<(sizeof...(T) <= N), std::bitset<N>>
make_flagged_bitset(T... args) noexcept {
return std::bitset<N>(((1ULL << args) | ...));
}

// 使用例
int main(void) {
constexpr auto table = make_flagged_bitset(8, 9, 12);
// セットしてないところは偽値
assert(table[0] == false);
assert(table[1] == false);
assert(table[10] == false);
assert(table[20] == false);
// セットしているところは真値
assert(table[8] == true);
assert(table[9] == true);
assert(table[12] == true);
}
2022/12/04(日) 19:19:16.77ID:flilPTWf0
>>524
やりたいことのイメージにすごく近いです
思いもつかない難しい構文で勉強になります
内容を理解して使わせていただきます
ありがとうございました
2022/12/04(日) 19:57:57.00ID:/CRfCGQ0a
定数でいいならマクロでやるとか
#include <cstdio>
#define _(i) (1 << i)
int main() {
int b = _(8) | _(9) | _(12);
for (int i = 0; i <= 12; i++) {
printf("%d:%d\n", i, (b >> i) & 1);
}
return 0;
}
2022/12/04(日) 20:05:21.16ID:YO7rrhiC0
>>525
念のために繰り返すけど >>524>>523 で述べた性質があるので 64 までしか保証されないし、
エラーチェックをあまり頑張ってないので使い方を間違えたときに捕捉されないかもしれない。
あくまでもおおざっぱにはこういう考えかたでいけるだろうというサンプルだからそのつもりで。
2022/12/04(日) 20:59:12.00ID:/CRfCGQ0a
訂正
#define _(i) (1 << i)
より
#define _(i) (1 << (i))
のほうが安心
2022/12/04(日) 23:12:00.77ID:flilPTWf0
これまでビット演算を意識したことがなかったので考え方を知れて助かります
提示いただいた例から自分でも調査が進められそうでなんとかなりそうです
いろいろありがとうございました
2022/12/05(月) 01:35:26.13ID:gMitSG4kM
>>529
ビット演算より、速度は、>>518が一番速いかも。
2022/12/05(月) 10:23:03.76ID:DqBKeem4M
一々メモリアクセスが発生して直感的には遅そうだけど
2022/12/05(月) 10:35:35.88ID:hYIKK9DOp
オプティマイズされるからなぁ
記述だけで速度なんか分からないよ
2022/12/05(月) 11:26:10.51ID:9YGPhFSH0
多分>>526が一番速いと思う
b と i がレジスタに乗れば最近のプロセッサーならシフトは1クロックだし
>>524は最適化が上手く行けば同じ位になりそう
2022/12/05(月) 12:04:38.42ID:AHxKL62Z0
俺なら3クロックでイッちゃうけどね
2022/12/05(月) 13:51:14.89ID:0xhTnbB50
速度重視なら>>518だろ
メモリ食うけど、つーてもキロバイト未満だし
古いワンチップマイコンとかじゃなきゃ微々たるもん
ハードできる人ならワイヤードロジックって手もある
2022/12/05(月) 13:53:40.80ID:iLlZW1brp
速度重視ならアセンブラ…

いや、何でも無い
2022/12/05(月) 14:04:07.58ID:0Re98eJO0
(Cだけど)昔は isalpha や is~ 系のやつはテーブル参照で実装してたのがあった
2022/12/05(月) 14:25:03.89ID:6Xcp09rU0
集合を扱うには std::set を使うのが楽だと思う。
集合を集合っぽく扱える機能は一通りそろってるからたぶん集合型というものに期待していることはだいたい含まれるよ。
Pascal の集合型のことはよう知らんけど。

(一般的に) std::set は二分木で実装されるという都合上、やりたいことによっては性能 (速度) 上の不満が生じることもあるかもしれないけど、
具体的な問題が出る前に先回りして考えてもだいたい徒労だしな。

>>537
実行時にロケールを切り替える必要性からじゃない?
2022/12/05(月) 14:43:13.12ID:9YGPhFSH0
>>537
今でもそうじゃないの?
>>520 > 引数で指定する際の値の範囲は0~31を超えることはなさそうなので
と言う条件だからビット演算の方が早いかもって話であって 、-1~255の範囲ならたいていの環境でテーブル引くのが最速だと思う
2022/12/05(月) 14:45:20.89ID:oclBynCfd
>>535
テーブル参照はキャッシュが絡むから
単純ではない
2022/12/05(月) 15:16:20.05ID:jV16hsjJ0
0〜255を格納する方は定数でしか使わないので>>518のやり方にしました
0〜31くらいまでしか使わない方は、変数に格納された任意の値の集合を
そのまま引数に渡したり、積集合や差集合を求めるのを想定しています

確かにstd::setがその用途ですね
速度が遅そうで敬遠していましたが、実際にはこれがボトルネックになることはないと思います
initializer_listと合わせれば、ほぼPascalと同じ使用感でいけるので、ビット演算のテクニックは
引き続き研究しつつ、いったんstd::setで実装しようと思います
2022/12/05(月) 15:31:21.47ID:0xhTnbB50
>>540
constexprも絡むね
2022/12/05(月) 17:26:36.58ID:rfCFGpMmM
>>540
キャッシュの話になると本当の速さがなかなか分からなくなってくる。
(CPUアーキテクチャやその他の処理の仕方に依存してしまうし。)
キャッシュがある CPU において、キャッシュミスが発生した場合は、
>>526の方が速いであろうと予測はされる。

そもそも、キャッシュの働きが弱いラズパイPICO、Arduino、ESP32 などでは
恐らく>>518 の方が速い。
そもそもシフト演算がシフト量に比例して遅くなるマイコンもあるだろうし。
Z80や8086はそうだった。

x86、x64の場合、
この関数を使うループの中で、他の目的のためにメモリーを大規模に使った場合は、
>>526の方が速いが、沢山メモリーを使わなかった場合は、>>518の方が速い。
2022/12/05(月) 17:29:22.78ID:jV16hsjJ0
std::setは集合演算が思った使い勝手ではなかったです
>>526と列挙型を組み合わせることにしました
長々とスレを消費し申し訳ありませんでした
どのレスも参考になり助かりました
2022/12/05(月) 18:42:52.30ID:6Xcp09rU0
>>544
イテレータを受け渡すのがめんどいな。
そのへんは適当なラッパー関数 (または演算子オーバーロード) を定義すればいいんでないの。
たぶんこんな感じにしたいのかな?
https://wandbox.org/permlink/kpYoEhyGaykqITEG
2022/12/05(月) 18:43:23.85ID:k8gztHb50
>>544
> std::setは集合演算が思った使い勝手ではなかったです
詳しく。
2022/12/05(月) 18:56:45.80ID:k8gztHb50
>>545 なるほどめんどくさいな。
よく考えたら contains すら C++20 からっていうのもひどい話よな。
2022/12/05(月) 20:18:26.80ID:Rd1Rhxq6a
江添が女性支援に批判的で笑ったわ
2022/12/05(月) 20:57:35.77ID:jV16hsjJ0
>>545
ありがとうございます
いろいろ知識や考えが足りませんでした
おかげ様で理想形に近づけることができました

std::set<T> operator*(const std::set<T>& x, std::initializer_list<T> init)
foo * _(1, 3, 5)
https://wandbox.org/permlink/14GBm1DqQ6iUaRPq
2022/12/06(火) 09:26:29.57ID:S4cyJC5Ur
>>548
ツイフェミに批判的なだけだったわ
2022/12/06(火) 09:51:28.64ID:mFLMdD4Ga
まあ、「ザ・男」ってタイプだからな
ケチがディテールにこだわるのもありがち
2022/12/06(火) 11:12:56.86ID:63yxghiR0
今や絶滅危惧種となったテキトーこくの嫌いな人
2022/12/06(火) 13:12:15.09ID:9i6eYS/u0
そういう人ここは比較的多いでしょ?
2022/12/06(火) 13:47:59.27ID:63yxghiR0
配列がハッシュだなんて裏も取らずに信じちまうやつもか?
2022/12/06(火) 14:38:33.85ID:mFLMdD4Ga
テーブルのアクセスに使う添字はインデックス?キー?
2022/12/06(火) 14:47:42.28ID:iX2JPZR5d
サブスクリプト
2022/12/06(火) 15:21:19.75ID:RihiShBFa
>>554
まだいたのかよ、よほど悔しかったんだなw
2022/12/06(火) 15:50:10.05ID:iX2JPZR5d
信じてたやつが返事してるな
今度こそ別人ではあるまい
2022/12/06(火) 15:56:04.19ID:iX2JPZR5d
HDDを指さしてメモリと言ってたやつのほうがまだマシ
記憶装置という点でそんなに大外れではないからな

配列を指さしてハッシュと言うやつは
アメリカザリガニを指さして飛行機と言うようなもんで
どうやっても擁護不可能
2022/12/06(火) 16:49:16.67ID:RihiShBFa
>>496 にレスできないクズ乙w
2022/12/06(火) 17:07:58.34ID:uWr4N4pQd
美味しいという共通点くらいしか
2022/12/06(火) 18:13:06.65ID:63yxghiR0
ここは技術板
配列とハッシュを混同すること以上の恥もクズも存在し得ない
2022/12/06(火) 18:23:59.19ID:qiG38keca
本人謝ってるのにしつこく絡むのは技術云々の前に人としてどうなの?
2022/12/06(火) 18:57:26.14ID:6Wvozz0/0
だれも謝罪してないし、配列もメモリマネージャーからみればハッシュだし
2022/12/06(火) 19:27:21.71ID:qiG38keca
>>564
> ただ今勉強中で頓珍漢なこと言ってしまった、すいません
クズにはこれが謝罪に見えないんだな...
2022/12/06(火) 19:41:58.07ID:6Wvozz0/0
EASTLは、unordered_mapに相当するクラスを独自実装しhash_mapと呼んできた経緯がある
Perlの専門用語が他言語に持ち込まれた分りやすい例といえるだろう
2022/12/06(火) 21:47:51.22ID:63yxghiR0
>>565
何? 謝罪したらこんなに恥をかかずに済んだってとこに、まだすがりたいの?
そりゃそうだろうね、技術板で最大の恥をさらしたんだからwww

おまえ悪態つきすぎたんだよ、こっちも悪意に満ちた対応するからな
もう覚悟するしかねえんだよ、おまえw
568デフォルトの名無しさん (ササクッテロラ Sp5f-w5YM)
垢版 |
2022/12/06(火) 21:59:01.18ID:Pw6mR/Vsp
粘着恥ずかしいw
569デフォルトの名無しさん (ワッチョイ c001-g9pY)
垢版 |
2022/12/06(火) 22:07:01.02ID:iea0dAEs0
C++使いは、その程度のことで粘着しない。
なぜなら、C++使いは爺だから。
2022/12/06(火) 22:59:17.33ID:wE68yyZV0
>>519
あんま細かいこと拘るとハゲるからな
2022/12/06(火) 23:00:17.17ID:wE68yyZV0
レス誤爆メンゴ
2022/12/06(火) 23:03:05.74ID:id7qJpRpr
爺こそ粘着するのでは?
暇だから
573デフォルトの名無しさん (ワッチョイ c001-g9pY)
垢版 |
2022/12/06(火) 23:07:03.02ID:iea0dAEs0
インテリ爺は粘着される方だろ。
2022/12/07(水) 06:03:51.56ID:BYUaD+1v0
unordered_mapはハッシュを使うというだけで、それ自体がハッシュだという主張は誤り
好意的に解釈してもデータメンバと継承を混同するようなもの
2022/12/07(水) 07:45:49.40ID:mMrpdU8md
>>571
メンゴって…
2022/12/07(水) 11:52:13.93ID:adYZ5td8d
まだハッシュ言ってるのか
Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
2022/12/07(水) 11:59:24.24ID:O14sy2T20
経緯を詳細に見る気もしないんだが話は展開していないし
執着の仕方が常軌を逸していると思う
初出は11/24(>>227)だよ! 2週間
578デフォルトの名無しさん (スププ Sd70-sdih)
垢版 |
2022/12/07(水) 13:47:36.67ID:e45EJ0mMd
粘着自体は無視スルーすれば良いからどうでもいいわ
それより将来鯖ログ開示されたとき
誰と誰が自演だったかの答え合わせはしてみたい
2022/12/07(水) 14:06:40.54ID:BYUaD+1v0
>>576
このスレでじゃねえよ
配列とハッシュは本質が異なるものだ

>>319 >>383で根本的な説明している
580デフォルトの名無しさん (ワッチョイ ce01-Znoa)
垢版 |
2022/12/07(水) 14:09:36.34ID:O14sy2T20
病的だな
2022/12/07(水) 14:42:14.43ID:FsTyICUTa
誰も興味ないわ
2022/12/07(水) 15:26:40.34ID:Xzjw4n/la
>>576
> Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
それを言ってるならまだ分からないでもないけど 配列 ≠ ハッシュ なんて本人謝ってるのにしつこく絡み続けてる
そんなことでしかマウント取れないんだろうけどマジでなんかの病気だと思うわ
2022/12/07(水) 15:34:18.88ID:4LPWB+Rga
ハゲの上塗り
584デフォルトの名無しさん (ササクッテロラ Sp5f-w5YM)
垢版 |
2022/12/07(水) 15:34:20.23ID:HdWAA0Dip
いいから相手にしない
もう飽きたよ
2022/12/07(水) 15:42:19.49ID:adYZ5td8d
>>579
じゃあParlスレでは適切だったねでもいいよ
皆お前さんの言ってることぐらい分かってる
2022/12/07(水) 17:13:38.78ID:BYUaD+1v0
謝るのに>>313のような態度で許されるとでも思っているのか
587デフォルトの名無しさん (ワッチョイ e75f-UplN)
垢版 |
2022/12/07(水) 19:28:34.64ID:cizNPWpb0
まーだやってるw
2022/12/07(水) 20:15:26.67ID:X5O9NNHYF
病気だよ
2022/12/07(水) 20:48:27.45ID:0xPH+d9p0
そもそも >>313 は Perl での呼び方の話で 配列 ≠ ハッシュ の話じゃないから謝罪なんてしてない
わざとなのか混乱してるのか知らんけど病的なのは間違いない
590デフォルトの名無しさん (ワッチョイ 0acf-L4s+)
垢版 |
2022/12/08(木) 08:19:28.46ID:/GcWMRnI0
>>576
そこにPerl界隈でも使ってないとか言う奴が現れて無駄に反論を呼んだ。
2022/12/08(木) 08:34:20.66ID:d3Fi/Jhx0
今日はParl Harbor攻撃から81年目に当たるらしい
2022/12/08(木) 10:11:41.48ID:JnPWza2ja
>>590
とりあえずそれはなんとか収まったけどその後 配列 ≠ ハッシュ 君が粘着しだした
2022/12/08(木) 10:26:23.30ID:7N/fyoNc0
煽り耐性なさすぎなハッシュ君
ちょっとカマかけると元気にお返事しやがんのw

終わりにしたいなら反応しなきゃいいのに
わざわざ出てくるマゾ野郎w
2022/12/08(木) 12:19:06.63ID:qJNUqX4GM
ハッシュの話をするやつはコテハン付けろ。NGするから。

コテハン無しでハッシュを話題にするのは禁止な。
2022/12/08(木) 12:45:20.88ID:JnPWza2ja
カマなんてかけてもないのに頓珍漢レスしてるキチに言われてもねw
2022/12/08(木) 13:41:50.14ID:7N/fyoNc0
反応してる時点でおまえ悔しさがにじみ出てるからw
こっちは誰が何と言おうと絶対に揺るがない基礎理論に基づいているから安心してアホにできてオモロイだけ
2022/12/08(木) 14:56:30.96ID:d3Fi/Jhx0
「C++」が「Java」を抜いて3位に--12月のTIOBEプログラミング言語ランキング - ZDNet Japan
https://japan.zdnet.com/article/35197053/
Liam Tung (Special to ZDNet.com) 翻訳校正: 編集部 2022-12-07 11:32
2022/12/08(木) 15:02:28.31ID:/H4Yp5E/0
今更流行る理由があるのか
AI?
2022/12/08(木) 16:44:45.46ID:iuNweycO0
多次元配列クラスのSTL入りもまだなのにAIwwwwwwwwwwwww
2022/12/08(木) 16:45:49.30ID:MKGRO6qH0
>C++の人気が高まる一方で、Javaの人気は低下している
601デフォルトの名無しさん (ササクッテロラ Spd7-w5YM)
垢版 |
2022/12/08(木) 18:04:41.79ID:F9H67G14p
今更メモリー管理したくないよぉ
2022/12/08(木) 18:10:36.30ID:z+sTXcJV0
>>600
Objective-C(29位から19位に)
みたいな不思議ランキングなんだから、あんまり意味無いんじゃない?
2022/12/08(木) 18:26:03.92ID:FVxzWUbn0
>>601
したくないけどする必要があるときには C++ くらいの機構があるとやりやすいんじゃろ。 知らんけど。
2022/12/08(木) 18:33:45.11ID:lUjyKwZV0
デストラクタが無い言語とか論外じゃね?
2022/12/08(木) 19:14:03.24ID:ZTTdli19a
基礎理論w
606デフォルトの名無しさん (ワッチョイ c001-g9pY)
垢版 |
2022/12/08(木) 19:42:03.83ID:pXyaJjcm0
欧米の知的な人たちの間でC++が流行ってるんだろ。
2022/12/08(木) 19:43:41.79ID:pfHF/B3ga
したくないというポイントはだいたい稼げるところだな
2022/12/08(木) 20:48:03.13ID:+R/2mzDC0
インテリ
ジェンス
2022/12/10(土) 04:54:52.93ID:NVs+qJ8Ua
まぁゲーム開発はいつまでもC++だからなぁ。ついでC#
2022/12/10(土) 12:17:36.89ID:c/3U+eWJ0
UIはその時の流行りの言語で書くけど戦術ロジックだけは絶対にC++で書きたい
611デフォルトの名無しさん (ササクッテロラ Sp1b-Xf+d)
垢版 |
2022/12/10(土) 12:26:15.44ID:z6yEzr6lp
C#って、むしろ大規模になって来ると意味不明なエラーが出て破綻しないか?
612デフォルトの名無しさん (ブーイモ MM8b-CGXW)
垢版 |
2022/12/10(土) 14:59:01.80ID:mMjCV03FM
C#が悪いわけではないけど、メモリー解放とかルーズにしたままある程度コード書けちゃうからね、、、
大規模になってくると無頓着だったメモリー解放が火を吹く感じはある

C++はそんなルーズな書き方してたらすぐ破綻するから、そういうコードは多くないけど初期の実装には多くの時間がかかる感じ
2022/12/10(土) 15:38:10.95ID:Sts37KEXa
c#のプロジェクトはなんか疎結合になっとらんこと多いわ
2022/12/10(土) 17:52:23.34ID:brInbnm70
プロジェクトを分割しようとしてもどうにも分離しきれない絡み合った部分ってあると思うんよ。
そういうときは機能別に分割するというだけではなく絡み合った部分は絡み合ったものとしてレイヤとして切り分けると上手くいく。
面倒くさいところは一か所に押し込めて横に切る感じ。

C# のプロジェクトはレイヤで分ける意識が希薄で縦割りばかりするので分離しきれない結合が全体にうっすらと残ってる感じ。
密結合というほどではないけど全体にうっすらなので、面倒くさい箇所が一か所にまとまってるよりしんどい。

というのが私の印象。 C# のことはあんまり知らんけど。
2022/12/10(土) 18:06:38.22ID:7p0k8251M
https://ideone.com/gopFXn
なんか100回転してから落とすコード書いたはずがヘンな事になってる。
間違ってたかな?向こうのバグかな??
616デフォルトの名無しさん (ワッチョイ 675f-k8RX)
垢版 |
2022/12/10(土) 20:25:28.70ID:PM5iwksI0
DのUpdateみると1000ms待たないと終わらないように見えるけどそれはいいの?
2022/12/10(土) 20:33:03.87ID:6SBPs3AFH
>>614
トップダウン、ボトムアップ、両面から書いていったとき、それが出会うところでグダグダなその場しのぎのコードに書かざるを得ない経験はありますね
2022/12/10(土) 20:33:20.22ID:MWcOm8HwM
#include <iostream>

int main() {
const int i = 1;
++*const_cast<int*>(&i);
std::cout << i;
}

何が表示されると思う?
違法?合法?

https://wandbox.org/permlink/57h9V6JX7fJes663
2022/12/10(土) 20:55:46.09ID:G20+9FPP0
>>618
const なオブジェクトに書き込むのは許されない (未定義) が型の上で const を外すだけならアリ。 つまり ++ を除けば合法だが ++ のせいで違法。
620デフォルトの名無しさん (アウアウウー Sa6b-k8RX)
垢版 |
2022/12/10(土) 21:19:19.36ID:+Ttg8yU5a
int main() {
const int i = 1;
int*j =const_cast<int*>(&i);
*j=2;
std::cout << &i<<" "<< j<<std::endl;
std::cout<<i <<" "<< *j;
}

https://wandbox.org/permlink/DC1E3ycea3UtdBAI

0x7ffc53e76e1c 0x7ffc53e76e1c
1 2

上のやつちょっといじってみた
アドレスの値同じなのに値違うんだけどなんでなんだろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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