!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
探検
C++相談室 part162
■ このスレッドは過去ログ倉庫に格納されています
1sage (ワッチョイ fbf0-ofdD)
2022/10/31(月) 14:29:35.57ID:J5sgTSch0478デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 09:23:14.36ID:qMCuKdke0 std::uint64_tの加算オーバーフロー時の挙動がunsigned intと同様にwrap aroundなんなら普通に
std::uint64_t foo(const int n) { return ((std::int64_t)1 << n) - (std::int64_t)1; }
で良くねconstexpr的な何かとかでマズい?
std::uint64_t foo(const int n) { return ((std::int64_t)1 << n) - (std::int64_t)1; }
で良くねconstexpr的な何かとかでマズい?
479はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/03(土) 09:26:37.99ID:riW5om/o0 すまぬ。 >>477 だと n が 0 のときは未定義なのでそれだけ場合分けが必要になってしまうな。
だからといって (std::uint64_t(1) << n) - 1 だと 64 のときが駄目だし、
場合分け無しという条件だと思ったよりめんどいかも?
だからといって (std::uint64_t(1) << n) - 1 だと 64 のときが駄目だし、
場合分け無しという条件だと思ったよりめんどいかも?
480デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 09:43:52.56ID:qMCuKdke0 違った加算オーバーフローの話やなかったorz
シフト演算については
If E1 has an unsigned
type, the value of the result is E1 × 2E2, reduced modulo one more than the maximum value representable
in the result type.
E1 が符号なし型を持つ場合、結果の値は、E1 * 2E2 の、結果の型で表現可能な最大値より 1 大きい値を法とする剰余となる
なので言語規格上は (uint64_t)1 << 64は合法なはず……
シフト演算については
If E1 has an unsigned
type, the value of the result is E1 × 2E2, reduced modulo one more than the maximum value representable
in the result type.
E1 が符号なし型を持つ場合、結果の値は、E1 * 2E2 の、結果の型で表現可能な最大値より 1 大きい値を法とする剰余となる
なので言語規格上は (uint64_t)1 << 64は合法なはず……
481デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 09:49:24.58ID:qMCuKdke0 訂正orz
誤: 2E2
正: 2**E2 (2のE2乗)
符号付きの型はオーバーフローで例外を発生するアーキテクチャーがあるから
表現できるビット数からあふれるコーディングは未定義動作か何かやが
符号無し型はモジュロ演算になるから溢れてもおk
と言う印象(記憶モード
※ 個人の感想です
誤: 2E2
正: 2**E2 (2のE2乗)
符号付きの型はオーバーフローで例外を発生するアーキテクチャーがあるから
表現できるビット数からあふれるコーディングは未定義動作か何かやが
符号無し型はモジュロ演算になるから溢れてもおk
と言う印象(記憶モード
※ 個人の感想です
482はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/03(土) 10:04:27.89ID:riW5om/o0 >>478
> https://timsong-cpp.github.io/cppwp/n3337/expr.shift
> The behavior is undefined if the right operand is negative, or greater than
> or equal to the length in bits of the promoted left operand.
シフト演算子では右オペランドが (昇格済みの) 左オペランドの幅以上の値だったときは未定義。
> https://timsong-cpp.github.io/cppwp/n3337/expr.shift
> The behavior is undefined if the right operand is negative, or greater than
> or equal to the length in bits of the promoted left operand.
シフト演算子では右オペランドが (昇格済みの) 左オペランドの幅以上の値だったときは未定義。
483はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/03(土) 10:15:30.26ID:riW5om/o0 std::bitset を経由すれば大丈夫だということを発見した。
std::uint64_t((compl std::bitset<64>(0)>>(64-n)).to_ullong())
これを「スッキリ」といえるかどうかは微妙なところかもしれぬ……。
std::uint64_t((compl std::bitset<64>(0)>>(64-n)).to_ullong())
これを「スッキリ」といえるかどうかは微妙なところかもしれぬ……。
484デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 11:26:23.20ID:qMCuKdke0 >>482
わかりた
ではこう汁、
指数 n == (n/2) + (n/2) + (n & 1) ※ 除算は結果の小数以下切り捨て
ので
2**n - 1 = 2**((n/2) + (n/2) + (n & 1)) - 1
= 2**(n/2) * 2**(n/2) * 2**(n&1) - 1
よって
std::uint64_t foo(const int n) {
const std::int64_t x = (std::uint64_t)1 << (n / 2);
return (x * x * ((std::uint64_t)1 << (n & 1)) - (std::int64_t)1;
}
でだいたいおk、
わかりた
ではこう汁、
指数 n == (n/2) + (n/2) + (n & 1) ※ 除算は結果の小数以下切り捨て
ので
2**n - 1 = 2**((n/2) + (n/2) + (n & 1)) - 1
= 2**(n/2) * 2**(n/2) * 2**(n&1) - 1
よって
std::uint64_t foo(const int n) {
const std::int64_t x = (std::uint64_t)1 << (n / 2);
return (x * x * ((std::uint64_t)1 << (n & 1)) - (std::int64_t)1;
}
でだいたいおk、
485デフォルトの名無しさん (ワッチョイ 2647-fbc4)
2022/12/03(土) 11:32:11.79ID:D7LggL4j0 n?1ull<<(n-1):0
486デフォルトの名無しさん (スップ Sd02-HF5l)
2022/12/03(土) 11:45:55.06ID:Xj+KmoE3d487デフォルトの名無しさん (スップ Sd02-HF5l)
2022/12/03(土) 11:53:09.20ID:Xj+KmoE3d constexpr uint64_t TABLE[65] = {
0x0000000000000000,
0x0000000000000001,
0x0000000000000003,
...
0xffffffffffffffff
};
return TABLE[n];
0x0000000000000000,
0x0000000000000001,
0x0000000000000003,
...
0xffffffffffffffff
};
return TABLE[n];
488デフォルトの名無しさん (スップ Sd02-HF5l)
2022/12/03(土) 11:57:41.15ID:Xj+KmoE3d x86-64の場合
shl reg, clのclは下位6bitしか見ないから
1ull<<nが正しく動いた場合マシン語レベルでは分岐してることになる
shl reg, clのclは下位6bitしか見ないから
1ull<<nが正しく動いた場合マシン語レベルでは分岐してることになる
489デフォルトの名無しさん (ワッチョイ 9fc2-4FAg)
2022/12/03(土) 21:09:42.26ID:WYd/d9iJ0490デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 23:32:15.77ID:qMCuKdke0 (ID:Xj+KmoE3d が天才すぎてつらいので埋め)
491デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/03(土) 23:46:07.24ID:mCv82Mp+M ところで、C++でも、Javab磴#でも、メモャ梶[不足例外を封竭ォしない風潮bノなっている
ようです。それは、メモリー不足が起きる可能性があるところの、
文字列合成やコンテナ要素追加が簡単に書けるようになった反面、
その全ての箇所でエラー処理をするのはめんどくさすぎるという
事情から来ていると思います。
しかし、テキスとエディタなどで、一文字や一行追加した時にメモリーが確保できない
場合に、「メモリーが一杯です」などと表示することはMS-DOSならよくあったことで、
そのような場合にメモリー不足例外を補足する事は原理的には可能です。
いまや、そのような場合のメモリー不足はほぼ起き得なくなってますが、エラーを感知
しないで本当に良いと思われますか?
もっと進めれば、メモリー不足例外は、商用アプリでも「完全無視」を決め込んでも良いと
思われますか?
ようです。それは、メモリー不足が起きる可能性があるところの、
文字列合成やコンテナ要素追加が簡単に書けるようになった反面、
その全ての箇所でエラー処理をするのはめんどくさすぎるという
事情から来ていると思います。
しかし、テキスとエディタなどで、一文字や一行追加した時にメモリーが確保できない
場合に、「メモリーが一杯です」などと表示することはMS-DOSならよくあったことで、
そのような場合にメモリー不足例外を補足する事は原理的には可能です。
いまや、そのような場合のメモリー不足はほぼ起き得なくなってますが、エラーを感知
しないで本当に良いと思われますか?
もっと進めれば、メモリー不足例外は、商用アプリでも「完全無視」を決め込んでも良いと
思われますか?
492デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/03(土) 23:47:44.27ID:mCv82Mp+M >>491
携帯SIMを使っているので電波にエラーが生じたらしいです:
誤:ところで、C++でも、Javab磴#でも、メモャ梶[不足例外を封竭ォしない風潮bノなっている
正:ところで、C++でも、JavaやC#でも、メモリ不足例外を補足しない風潮になっている
携帯SIMを使っているので電波にエラーが生じたらしいです:
誤:ところで、C++でも、Javab磴#でも、メモャ梶[不足例外を封竭ォしない風潮bノなっている
正:ところで、C++でも、JavaやC#でも、メモリ不足例外を補足しない風潮になっている
493デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 00:02:09.11ID:r/mQBEYb0 >エラーを感知 しないで本当に良いと思われますか?
良い
どうせメモリ不足になったら有効なことはほとんど何もできない
ただしそのかわり処理の不意の中断から絶対に保護すべきリソースとか絶対動かしたままにしてはいけない処理は
例外安全なクラスで管理して確実にクローズ処理せねばならない
jこれはメモリ不足の状況でも同じで、そういうのはヒープを使わないで書くのが最善やが、
内部でヒープを使うライブラリに依存している等でヒープをどうしても使わざるおえないの場合は
事前malloc()→例外捕捉時に解放、というテクが昔からあっる
良い
どうせメモリ不足になったら有効なことはほとんど何もできない
ただしそのかわり処理の不意の中断から絶対に保護すべきリソースとか絶対動かしたままにしてはいけない処理は
例外安全なクラスで管理して確実にクローズ処理せねばならない
jこれはメモリ不足の状況でも同じで、そういうのはヒープを使わないで書くのが最善やが、
内部でヒープを使うライブラリに依存している等でヒープをどうしても使わざるおえないの場合は
事前malloc()→例外捕捉時に解放、というテクが昔からあっる
494デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:02:21.62ID:BcAMllhiM スタック的な(?)コンテナで、pop_back()メソッドは戻り値が void型で、
つまり、pop したデータを返しませんが、BJ. stroustrup氏によれば、
それもreturn文で要素をコピー(?)する際に、メモリー不足例外が起きる
可能性考慮したとのことです。
どうしてmoveじゃ駄目なのかもし分かりませんでしたが。
つまり、pop したデータを返しませんが、BJ. stroustrup氏によれば、
それもreturn文で要素をコピー(?)する際に、メモリー不足例外が起きる
可能性考慮したとのことです。
どうしてmoveじゃ駄目なのかもし分かりませんでしたが。
495デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:04:34.95ID:BcAMllhiM >>493
>どうせメモリ不足になったら有効なことはほとんど何もできない
MS-DOSの時、テキストエディタなどではメモリー不足になると、
ちゃんとメッセージを出して、なおかつ、その後もメモリーが無い割には
安定動作してました。
>どうせメモリ不足になったら有効なことはほとんど何もできない
MS-DOSの時、テキストエディタなどではメモリー不足になると、
ちゃんとメッセージを出して、なおかつ、その後もメモリーが無い割には
安定動作してました。
496デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/04(日) 00:11:51.06ID:S/+N28Tr0497デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 00:17:03.45ID:r/mQBEYb0498デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 00:20:25.80ID:r/mQBEYb0 >>495
おま環、
おま環、
499デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:31:29.29ID:BcAMllhiM >>497
>x = queue.pop();
>というのを許すキューの仕様だと
>とキュー上のx'とそのコピーxが同時に存在するタイミングが一瞬生じてメモリ不足になりかねないという
よく分かりません。できればもっと詳しくお願いできませんか。
キュー上の x' を x に move すれば駄目なのでしょうか?
>xにムーブコンストラが定義してありqueue.pop()をムーブ対応に設計したとしても
>ムーブコンストラクタが呼ばれる時間の無駄は相変わらず存在する
>最も効率が良いのはpop()するタイミングまでキュー上のオブジェクトの参照を返し、
>pop()するタイミングではキュー上のオブジェクトの破棄のみ行うという現行のインターフェース、
なるほど、参照で返すのは効率がよいのは分かりますが、stroustrup氏によれば、moveは
速いと主張されているわけです。
私はmoveより参照の方が効率が良いと常々思っておりましたが。
彼はmoveが大好きなはずなのですが。
>x = queue.pop();
>というのを許すキューの仕様だと
>とキュー上のx'とそのコピーxが同時に存在するタイミングが一瞬生じてメモリ不足になりかねないという
よく分かりません。できればもっと詳しくお願いできませんか。
キュー上の x' を x に move すれば駄目なのでしょうか?
>xにムーブコンストラが定義してありqueue.pop()をムーブ対応に設計したとしても
>ムーブコンストラクタが呼ばれる時間の無駄は相変わらず存在する
>最も効率が良いのはpop()するタイミングまでキュー上のオブジェクトの参照を返し、
>pop()するタイミングではキュー上のオブジェクトの破棄のみ行うという現行のインターフェース、
なるほど、参照で返すのは効率がよいのは分かりますが、stroustrup氏によれば、moveは
速いと主張されているわけです。
私はmoveより参照の方が効率が良いと常々思っておりましたが。
彼はmoveが大好きなはずなのですが。
500デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 00:37:44.43ID:r/mQBEYb0501デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:41:37.02ID:BcAMllhiM >>500
>ムーブコンストラが呼ばれる時間の無駄がある(2回目
なるほど、ならば、スタックポインタだけ元に戻して、値は捨ててしまう
バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
>ムーブコンストラが呼ばれる時間の無駄がある(2回目
なるほど、ならば、スタックポインタだけ元に戻して、値は捨ててしまう
バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
502デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:43:51.82ID:BcAMllhiM >>501
Strousstrup氏によると、メモリー不足になって例外が生じた場合の
対処が難しい、みたいなことを言っていたと思います。
しかし、moveコンストラクタ/代入を使った場合にはメモリー不足も生じませんし、
moveコンストラクタ/代入は例外を生じさせてはいけない、と彼自身は
普段から何度も言及していたと思うんです。
Strousstrup氏によると、メモリー不足になって例外が生じた場合の
対処が難しい、みたいなことを言っていたと思います。
しかし、moveコンストラクタ/代入を使った場合にはメモリー不足も生じませんし、
moveコンストラクタ/代入は例外を生じさせてはいけない、と彼自身は
普段から何度も言及していたと思うんです。
503デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:49:09.96ID:BcAMllhiM >>502
仮にstackの要素クラスにコピーコンストラクタしかない場合は、メモリー不足が
生じてstd::bad_alloc 例外がthrowされる場合があるとは思いますが、難しい
とは言ってもそれが生じた場合に対処が全く出来ないとは思えません。
あるとすれば、要素がmoveコンストラクタを持っている場合でも、
try catch ブロックを書くことで、オーバーヘッドが生じる
場合があることを彼は恐れていたのでしょうか。
仮にstackの要素クラスにコピーコンストラクタしかない場合は、メモリー不足が
生じてstd::bad_alloc 例外がthrowされる場合があるとは思いますが、難しい
とは言ってもそれが生じた場合に対処が全く出来ないとは思えません。
あるとすれば、要素がmoveコンストラクタを持っている場合でも、
try catch ブロックを書くことで、オーバーヘッドが生じる
場合があることを彼は恐れていたのでしょうか。
504デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 01:11:37.29ID:r/mQBEYb0 >>501
ムーブしたかったらqueue.front()が返す参照でキュー上のx'をxか何かにムーブするだけ(※1)で良くね↑?
x = std::move(queue.front());
queue.pop_front();
※1: xやx'のクラスにムーブコンストラの定義は必要
>スタックポインタだけ元に戻して、値は捨ててしまう
>バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
ムーブするpop_front()と、デストラクタを呼ぶだけの今のpop_front()がどこが同じなのかkwsk、
ムーブしたかったらqueue.front()が返す参照でキュー上のx'をxか何かにムーブするだけ(※1)で良くね↑?
x = std::move(queue.front());
queue.pop_front();
※1: xやx'のクラスにムーブコンストラの定義は必要
>スタックポインタだけ元に戻して、値は捨ててしまう
>バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
ムーブするpop_front()と、デストラクタを呼ぶだけの今のpop_front()がどこが同じなのかkwsk、
505デフォルトの名無しさん (ワッチョイ d8cf-R4o2)
2022/12/04(日) 01:20:22.79ID:qWdYVkpM0 標準例外安全規則と強い保証がどうのこうの
506デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 01:33:30.77ID:BcAMllhiM >>504
マシン語の「pop命令」は伝統的に、スタックポインタを戻すことと、値を読み出すことを
同時に行っていました。
C++の設計では、値の読み出しと、スタックポインタを戻すことが分かれており、命名も
変なのです。
つまり、2つの事を合体させて行なうのが伝統的に「pop」であった伝統や習慣とは
異なる命名をC++はとってしまっているので、心理的に受け入れがたくなっているわけです。
マシン語の「pop命令」は伝統的に、スタックポインタを戻すことと、値を読み出すことを
同時に行っていました。
C++の設計では、値の読み出しと、スタックポインタを戻すことが分かれており、命名も
変なのです。
つまり、2つの事を合体させて行なうのが伝統的に「pop」であった伝統や習慣とは
異なる命名をC++はとってしまっているので、心理的に受け入れがたくなっているわけです。
507デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 01:50:30.99ID:BcAMllhiM >>506
例えば、Rustのpopは、ちゃんとマシン語の伝統と同じく、
戻り値が読み出された値になっていて、かつ、スタックポインタも戻ります。
C++のはどうしてこうなったのか、と思うように伝統を破ってます。
伝統を知らない人が作ったかのように。
例えば、Rustのpopは、ちゃんとマシン語の伝統と同じく、
戻り値が読み出された値になっていて、かつ、スタックポインタも戻ります。
C++のはどうしてこうなったのか、と思うように伝統を破ってます。
伝統を知らない人が作ったかのように。
508デフォルトの名無しさん (ワッチョイ 847c-XFic)
2022/12/04(日) 02:00:59.03ID:6yRfEQxP0 削除と値返却を同時にやるpop()が例外安全的に糞だって話はExceptionalC++に1章割いて載ってたはず
今手元にないけど
今手元にないけど
509デフォルトの名無しさん (ワッチョイ d8cf-R4o2)
2022/12/04(日) 02:03:07.32ID:qWdYVkpM0 C++だけでなく、いくつかの言語で、配列にアクセスするのに
push() pop() といった名前の関数があるから、その流れじゃないの
対象はあくまでも配列であって、cpu のスタックとは色々異なるわけだし
そこでどこまでスタックぽく扱うかは、言語の仕様というか設計者のお好みによるというかw
push() pop() といった名前の関数があるから、その流れじゃないの
対象はあくまでも配列であって、cpu のスタックとは色々異なるわけだし
そこでどこまでスタックぽく扱うかは、言語の仕様というか設計者のお好みによるというかw
510デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 02:10:09.58ID:BcAMllhiM >>508
その辺の話をここに書いていただけると幸いです。
その辺の話をここに書いていただけると幸いです。
511デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 02:22:20.52ID:BcAMllhiM >>510
自己レスですが、
https://stackoverflow.com/questions/25035691/why-doesnt-stdqueuepop-return-value
これですかね。
[Q] Why doesn't std::queue::pop return value.?
[A]
・・・
So, whats the difference, pop function could have done the same thing.
It could indeed have done the same thing. The reason it didn't, is because a pop that returned the popped element is unsafe in the presence of exceptions (having to return by value and thus creating a copy).
Consider this scenario (with a naive/made up pop implementation, to ilustrate my point):
template<class T>
class queue {
T* elements;
std::size_t top_position;
// stuff here
T pop()
{
auto x = elements[top_position];
// TODO: call destructor for elements[top_position] here
--top_position; // alter queue state here
return x; // calls T(const T&) which may throw
}
If the copy constructor of T throws on return, you have already altered the state of the queue (top_position in my naive implementation) and the element is removed from the queue (and not returned). For all intents and purposes (no matter how you catch the exception in client code) the element at the top of the queue is lost.
This implementation is also inefficient in the case when you do not need the popped value (i.e. it creates a copy of the element that nobody will use).
This can be implemented safely and efficiently, with two separate operations (void pop and const T& front()).
自己レスですが、
https://stackoverflow.com/questions/25035691/why-doesnt-stdqueuepop-return-value
これですかね。
[Q] Why doesn't std::queue::pop return value.?
[A]
・・・
So, whats the difference, pop function could have done the same thing.
It could indeed have done the same thing. The reason it didn't, is because a pop that returned the popped element is unsafe in the presence of exceptions (having to return by value and thus creating a copy).
Consider this scenario (with a naive/made up pop implementation, to ilustrate my point):
template<class T>
class queue {
T* elements;
std::size_t top_position;
// stuff here
T pop()
{
auto x = elements[top_position];
// TODO: call destructor for elements[top_position] here
--top_position; // alter queue state here
return x; // calls T(const T&) which may throw
}
If the copy constructor of T throws on return, you have already altered the state of the queue (top_position in my naive implementation) and the element is removed from the queue (and not returned). For all intents and purposes (no matter how you catch the exception in client code) the element at the top of the queue is lost.
This implementation is also inefficient in the case when you do not need the popped value (i.e. it creates a copy of the element that nobody will use).
This can be implemented safely and efficiently, with two separate operations (void pop and const T& front()).
512デフォルトの名無しさん (スフッ Sd94-sdih)
2022/12/04(日) 10:36:33.77ID:9l16UriTd MMミネヲからはperlerの臭いがする
513デフォルトの名無しさん (ワッチョイ 3602-WJTY)
2022/12/04(日) 11:36:02.70ID:flilPTWf0 0〜255しか格納されないことが保証されている変数aがあって
その変数の値を以下のイメージのように判定する効率的なやり方はないでしょうか
a == {8, 9, 12}
aが{ }内のいずれかの値に該当しているかどうかを判定したいです
{ }はあらかじめ定数でもよいです
その変数の値を以下のイメージのように判定する効率的なやり方はないでしょうか
a == {8, 9, 12}
aが{ }内のいずれかの値に該当しているかどうかを判定したいです
{ }はあらかじめ定数でもよいです
514デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/04(日) 11:40:31.47ID:RAGda7mP0 set<int> unko { 8, 9, 12};
if(unko.find(a) != unko.end()) goto hell;
if(unko.find(a) != unko.end()) goto hell;
515デフォルトの名無しさん (ワッチョイ 0a46-1DcW)
2022/12/04(日) 11:44:07.96ID:AOlAqVGT0 ルックアップテーブル
516デフォルトの名無しさん (ワッチョイ 3602-WJTY)
2022/12/04(日) 11:54:47.89ID:flilPTWf0517デフォルトの名無しさん (ワッチョイ c001-g9pY)
2022/12/04(日) 12:07:00.75ID:JyCGAu5J0 std::bitset<256>はどうですか?
518デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 16:18:10.81ID:RV2/jwt7M >>513
BYTE qqq[256] = {};
void init() {
qqq[8]=1;
qqq[9]=1;
qqq[12]=1;
}
inline BOOL IsInQqq(int a)
{
return qqq[a];
}
BYTE qqq[256] = {};
void init() {
qqq[8]=1;
qqq[9]=1;
qqq[12]=1;
}
inline BOOL IsInQqq(int a)
{
return qqq[a];
}
519デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/04(日) 16:45:55.42ID:RAGda7mP0 inline bool is_8_9_12(uint8_t a)
{
return 0b0001'0011'0000'0000 & 1 << a;
}
{
return 0b0001'0011'0000'0000 & 1 << a;
}
520513 (ワッチョイ 3602-WJTY)
2022/12/04(日) 17:30:39.25ID:flilPTWf0 いろいろ例をありがとうございます
pascalからの移行で集合型をどうにか再現できないかと試している中での質問でした
pascalの集合型なら[8, 9, 12](8, 9, 12は一例で、本来は任意の値を指定したい)を
直接使えて便利なので多用していました
アドバイスのおかげで比較は近いことを再現できましたが、
それとは別のケースで[8, 9, 12]を直接関数の引数で指定する方法を探しています
引数で指定する際の値の範囲は0〜31を超えることはなさそうなので
ビットを立てた整数を返す、可変長引数を取る関数を作れば良さそうだと思いました
pascalからの移行で集合型をどうにか再現できないかと試している中での質問でした
pascalの集合型なら[8, 9, 12](8, 9, 12は一例で、本来は任意の値を指定したい)を
直接使えて便利なので多用していました
アドバイスのおかげで比較は近いことを再現できましたが、
それとは別のケースで[8, 9, 12]を直接関数の引数で指定する方法を探しています
引数で指定する際の値の範囲は0〜31を超えることはなさそうなので
ビットを立てた整数を返す、可変長引数を取る関数を作れば良さそうだと思いました
521デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/04(日) 17:37:18.99ID:S/+N28Tr0522513 (ワッチョイ 3602-WJTY)
2022/12/04(日) 17:49:59.78ID:flilPTWf0 std::bitset<256>も試してみましたが
{8, 9, 12} こういった形式単独で使えるやり方はないかと調べていました
{8, 9, 12} こういった形式単独で使えるやり方はないかと調べていました
523はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/04(日) 18:04:56.88ID:YO7rrhiC0 std::bitset は unsigned long long を受け取るコンストラクタには constexpr が付いてるので
それより小さいビット数の bitset についてならコンパイル時に計算してしまうことも出来る。
それより小さいビット数の bitset についてならコンパイル時に計算してしまうことも出来る。
524はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
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);
}
#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);
}
525513 (ワッチョイ 3602-WJTY)
2022/12/04(日) 19:19:16.77ID:flilPTWf0526デフォルトの名無しさん (アウアウウー Sab5-VKAQ)
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;
}
#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;
}
527はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/04(日) 20:05:21.16ID:YO7rrhiC0528デフォルトの名無しさん (アウアウウー Sab5-VKAQ)
2022/12/04(日) 20:59:12.00ID:/CRfCGQ0a 訂正
#define _(i) (1 << i)
より
#define _(i) (1 << (i))
のほうが安心
#define _(i) (1 << i)
より
#define _(i) (1 << (i))
のほうが安心
529513 (ワッチョイ 3602-WJTY)
2022/12/04(日) 23:12:00.77ID:flilPTWf0 これまでビット演算を意識したことがなかったので考え方を知れて助かります
提示いただいた例から自分でも調査が進められそうでなんとかなりそうです
いろいろありがとうございました
提示いただいた例から自分でも調査が進められそうでなんとかなりそうです
いろいろありがとうございました
530デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/05(月) 01:35:26.13ID:gMitSG4kM531デフォルトの名無しさん (ブーイモ MMba-mM0k)
2022/12/05(月) 10:23:03.76ID:DqBKeem4M 一々メモリアクセスが発生して直感的には遅そうだけど
532デフォルトの名無しさん (ササクッテロラ Sp10-cIXn)
2022/12/05(月) 10:35:35.88ID:hYIKK9DOp オプティマイズされるからなぁ
記述だけで速度なんか分からないよ
記述だけで速度なんか分からないよ
533デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/05(月) 11:26:10.51ID:9YGPhFSH0534デフォルトの名無しさん (ワッチョイ eead-NN2n)
2022/12/05(月) 12:04:38.42ID:AHxKL62Z0 俺なら3クロックでイッちゃうけどね
535デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/05(月) 13:51:14.89ID:0xhTnbB50536デフォルトの名無しさん (ササクッテロラ Sp10-cIXn)
2022/12/05(月) 13:53:40.80ID:iLlZW1brp 速度重視ならアセンブラ…
いや、何でも無い
いや、何でも無い
537デフォルトの名無しさん (ワッチョイ b069-Znoa)
2022/12/05(月) 14:04:07.58ID:0Re98eJO0 (Cだけど)昔は isalpha や is~ 系のやつはテーブル参照で実装してたのがあった
538はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/05(月) 14:25:03.89ID:6Xcp09rU0 集合を扱うには std::set を使うのが楽だと思う。
集合を集合っぽく扱える機能は一通りそろってるからたぶん集合型というものに期待していることはだいたい含まれるよ。
Pascal の集合型のことはよう知らんけど。
(一般的に) std::set は二分木で実装されるという都合上、やりたいことによっては性能 (速度) 上の不満が生じることもあるかもしれないけど、
具体的な問題が出る前に先回りして考えてもだいたい徒労だしな。
>>537
実行時にロケールを切り替える必要性からじゃない?
集合を集合っぽく扱える機能は一通りそろってるからたぶん集合型というものに期待していることはだいたい含まれるよ。
Pascal の集合型のことはよう知らんけど。
(一般的に) std::set は二分木で実装されるという都合上、やりたいことによっては性能 (速度) 上の不満が生じることもあるかもしれないけど、
具体的な問題が出る前に先回りして考えてもだいたい徒労だしな。
>>537
実行時にロケールを切り替える必要性からじゃない?
539デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/05(月) 14:43:13.12ID:9YGPhFSH0540デフォルトの名無しさん (スップ Sd9e-HF5l)
2022/12/05(月) 14:45:20.89ID:oclBynCfd541513 (ワッチョイ 3602-g9pY)
2022/12/05(月) 15:16:20.05ID:jV16hsjJ0 0〜255を格納する方は定数でしか使わないので>>518のやり方にしました
0〜31くらいまでしか使わない方は、変数に格納された任意の値の集合を
そのまま引数に渡したり、積集合や差集合を求めるのを想定しています
確かにstd::setがその用途ですね
速度が遅そうで敬遠していましたが、実際にはこれがボトルネックになることはないと思います
initializer_listと合わせれば、ほぼPascalと同じ使用感でいけるので、ビット演算のテクニックは
引き続き研究しつつ、いったんstd::setで実装しようと思います
0〜31くらいまでしか使わない方は、変数に格納された任意の値の集合を
そのまま引数に渡したり、積集合や差集合を求めるのを想定しています
確かにstd::setがその用途ですね
速度が遅そうで敬遠していましたが、実際にはこれがボトルネックになることはないと思います
initializer_listと合わせれば、ほぼPascalと同じ使用感でいけるので、ビット演算のテクニックは
引き続き研究しつつ、いったんstd::setで実装しようと思います
542デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/05(月) 15:31:21.47ID:0xhTnbB50 >>540
constexprも絡むね
constexprも絡むね
543530 (オイコラミネオ MM71-NwO+)
2022/12/05(月) 17:26:36.58ID:rfCFGpMmM >>540
キャッシュの話になると本当の速さがなかなか分からなくなってくる。
(CPUアーキテクチャやその他の処理の仕方に依存してしまうし。)
キャッシュがある CPU において、キャッシュミスが発生した場合は、
>>526の方が速いであろうと予測はされる。
そもそも、キャッシュの働きが弱いラズパイPICO、Arduino、ESP32 などでは
恐らく>>518 の方が速い。
そもそもシフト演算がシフト量に比例して遅くなるマイコンもあるだろうし。
Z80や8086はそうだった。
x86、x64の場合、
この関数を使うループの中で、他の目的のためにメモリーを大規模に使った場合は、
>>526の方が速いが、沢山メモリーを使わなかった場合は、>>518の方が速い。
キャッシュの話になると本当の速さがなかなか分からなくなってくる。
(CPUアーキテクチャやその他の処理の仕方に依存してしまうし。)
キャッシュがある CPU において、キャッシュミスが発生した場合は、
>>526の方が速いであろうと予測はされる。
そもそも、キャッシュの働きが弱いラズパイPICO、Arduino、ESP32 などでは
恐らく>>518 の方が速い。
そもそもシフト演算がシフト量に比例して遅くなるマイコンもあるだろうし。
Z80や8086はそうだった。
x86、x64の場合、
この関数を使うループの中で、他の目的のためにメモリーを大規模に使った場合は、
>>526の方が速いが、沢山メモリーを使わなかった場合は、>>518の方が速い。
544513 (ワッチョイ 3602-g9pY)
2022/12/05(月) 17:29:22.78ID:jV16hsjJ0545はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/05(月) 18:42:52.30ID:6Xcp09rU0 >>544
イテレータを受け渡すのがめんどいな。
そのへんは適当なラッパー関数 (または演算子オーバーロード) を定義すればいいんでないの。
たぶんこんな感じにしたいのかな?
https://wandbox.org/permlink/kpYoEhyGaykqITEG
イテレータを受け渡すのがめんどいな。
そのへんは適当なラッパー関数 (または演算子オーバーロード) を定義すればいいんでないの。
たぶんこんな感じにしたいのかな?
https://wandbox.org/permlink/kpYoEhyGaykqITEG
546デフォルトの名無しさん (ワッチョイ 915f-7kHv)
2022/12/05(月) 18:43:23.85ID:k8gztHb50547デフォルトの名無しさん (ワッチョイ 915f-7kHv)
2022/12/05(月) 18:56:45.80ID:k8gztHb50 >>545 なるほどめんどくさいな。
よく考えたら contains すら C++20 からっていうのもひどい話よな。
よく考えたら contains すら C++20 からっていうのもひどい話よな。
548デフォルトの名無しさん (アウアウウー Sab5-+hgW)
2022/12/05(月) 20:18:26.80ID:Rd1Rhxq6a 江添が女性支援に批判的で笑ったわ
549513 (ワッチョイ 3602-Ly+b)
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
ありがとうございます
いろいろ知識や考えが足りませんでした
おかげ様で理想形に近づけることができました
std::set<T> operator*(const std::set<T>& x, std::initializer_list<T> init)
foo * _(1, 3, 5)
https://wandbox.org/permlink/14GBm1DqQ6iUaRPq
550デフォルトの名無しさん (オッペケ Sr10-4Nt7)
2022/12/06(火) 09:26:29.57ID:S4cyJC5Ur >>548
ツイフェミに批判的なだけだったわ
ツイフェミに批判的なだけだったわ
551デフォルトの名無しさん (アウアウウー Sa08-+hgW)
2022/12/06(火) 09:51:28.64ID:mFLMdD4Ga まあ、「ザ・男」ってタイプだからな
ケチがディテールにこだわるのもありがち
ケチがディテールにこだわるのもありがち
552デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/06(火) 11:12:56.86ID:63yxghiR0 今や絶滅危惧種となったテキトーこくの嫌いな人
553デフォルトの名無しさん (ワッチョイ ce01-Znoa)
2022/12/06(火) 13:12:15.09ID:9i6eYS/u0 そういう人ここは比較的多いでしょ?
554デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/06(火) 13:47:59.27ID:63yxghiR0 配列がハッシュだなんて裏も取らずに信じちまうやつもか?
555デフォルトの名無しさん (アウアウウー Sa08-+hgW)
2022/12/06(火) 14:38:33.85ID:mFLMdD4Ga テーブルのアクセスに使う添字はインデックス?キー?
556デフォルトの名無しさん (スッップ Sd70-AXrT)
2022/12/06(火) 14:47:42.28ID:iX2JPZR5d サブスクリプト
557デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/06(火) 15:21:19.75ID:RihiShBFa >>554
まだいたのかよ、よほど悔しかったんだなw
まだいたのかよ、よほど悔しかったんだなw
558デフォルトの名無しさん (スッップ Sd70-AXrT)
2022/12/06(火) 15:50:10.05ID:iX2JPZR5d 信じてたやつが返事してるな
今度こそ別人ではあるまい
今度こそ別人ではあるまい
559デフォルトの名無しさん (スッップ Sd70-AXrT)
2022/12/06(火) 15:56:04.19ID:iX2JPZR5d HDDを指さしてメモリと言ってたやつのほうがまだマシ
記憶装置という点でそんなに大外れではないからな
配列を指さしてハッシュと言うやつは
アメリカザリガニを指さして飛行機と言うようなもんで
どうやっても擁護不可能
記憶装置という点でそんなに大外れではないからな
配列を指さしてハッシュと言うやつは
アメリカザリガニを指さして飛行機と言うようなもんで
どうやっても擁護不可能
560デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/06(火) 16:49:16.67ID:RihiShBFa >>496 にレスできないクズ乙w
561デフォルトの名無しさん (スッップ Sd94-bEFD)
2022/12/06(火) 17:07:58.34ID:uWr4N4pQd 美味しいという共通点くらいしか
562デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/06(火) 18:13:06.65ID:63yxghiR0 ここは技術板
配列とハッシュを混同すること以上の恥もクズも存在し得ない
配列とハッシュを混同すること以上の恥もクズも存在し得ない
563デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/06(火) 18:23:59.19ID:qiG38keca 本人謝ってるのにしつこく絡むのは技術云々の前に人としてどうなの?
564デフォルトの名無しさん (ワッチョイ 30ad-4FAg)
2022/12/06(火) 18:57:26.14ID:6Wvozz0/0 だれも謝罪してないし、配列もメモリマネージャーからみればハッシュだし
565デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/06(火) 19:27:21.71ID:qiG38keca566デフォルトの名無しさん (ワッチョイ 30ad-4FAg)
2022/12/06(火) 19:41:58.07ID:6Wvozz0/0 EASTLは、unordered_mapに相当するクラスを独自実装しhash_mapと呼んできた経緯がある
Perlの専門用語が他言語に持ち込まれた分りやすい例といえるだろう
Perlの専門用語が他言語に持ち込まれた分りやすい例といえるだろう
567デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/06(火) 21:47:51.22ID:63yxghiR0 >>565
何? 謝罪したらこんなに恥をかかずに済んだってとこに、まだすがりたいの?
そりゃそうだろうね、技術板で最大の恥をさらしたんだからwww
おまえ悪態つきすぎたんだよ、こっちも悪意に満ちた対応するからな
もう覚悟するしかねえんだよ、おまえw
何? 謝罪したらこんなに恥をかかずに済んだってとこに、まだすがりたいの?
そりゃそうだろうね、技術板で最大の恥をさらしたんだから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++使いは爺だから。
なぜなら、C++使いは爺だから。
570デフォルトの名無しさん (ワッチョイ ecda-/mMf)
2022/12/06(火) 22:59:17.33ID:wE68yyZV0 >>519
あんま細かいこと拘るとハゲるからな
あんま細かいこと拘るとハゲるからな
571デフォルトの名無しさん (ワッチョイ ecda-/mMf)
2022/12/06(火) 23:00:17.17ID:wE68yyZV0 レス誤爆メンゴ
572デフォルトの名無しさん (オッペケ Sr5f-3U9L)
2022/12/06(火) 23:03:05.74ID:id7qJpRpr 爺こそ粘着するのでは?
暇だから
暇だから
573デフォルトの名無しさん (ワッチョイ c001-g9pY)
2022/12/06(火) 23:07:03.02ID:iea0dAEs0 インテリ爺は粘着される方だろ。
574デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/07(水) 06:03:51.56ID:BYUaD+1v0 unordered_mapはハッシュを使うというだけで、それ自体がハッシュだという主張は誤り
好意的に解釈してもデータメンバと継承を混同するようなもの
好意的に解釈してもデータメンバと継承を混同するようなもの
575デフォルトの名無しさん (スッップ Sd94-bEFD)
2022/12/07(水) 07:45:49.40ID:mMrpdU8md >>571
メンゴって…
メンゴって…
576デフォルトの名無しさん (スッップ Sd70-YdaX)
2022/12/07(水) 11:52:13.93ID:adYZ5td8d まだハッシュ言ってるのか
Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
577デフォルトの名無しさん (ワッチョイ ce01-Znoa)
2022/12/07(水) 11:59:24.24ID:O14sy2T20■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【日本大使館】中国在留邦人は安全確保を [ぐれ★]
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★10 [ぐれ★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 【朗報】愛国烈士ほんこん、高市首相のために長文を投稿wwwwwwwwwwwww [834922174]
- ニートしかいない時間ってマジでつまんないよな
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 千速は誰とのカップリングがエロいのか
- 高市コイン、155円突破wwwwwwwwww [246620176]
- おじゃる丸をまったり待機するスレ🏡
