C++相談室 part155 ..
[2ch|▼Menu]
2:はちみつ餃子
21/03/24 13:01:36.77 eNnFQgEr.net
2get

3:デフォルトの名無しさん
21/03/24 13:37:00.67 uPqg/PBu.net
msysの thread_local が、わりとちゃんと動くのがありがたい
昔は当たり前にクラッシュしてた

4:デフォルトの名無しさん
21/03/24 23:24:56.26 DDXRo65G.net
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

5:はちみつ餃子
21/03/25 00:13:37.31 eNzfljpt.net
>>4
このテンプレ


6:ヘいつまで貼るの?



7:デフォルトの名無しさん
21/03/25 00:32:41.48 BFmdRR/m.net
たぶん最初に書いた本人以外はだれも気に入ってないと思う
もうやめたほうがいい

8:デフォルトの名無しさん
21/03/25 13:58:38.53 VH1J0VUJ.net
glslのnoise関数のような、特定の入力に対して、特定の乱数を返すような関数はありますか?C++に

9:デフォルトの名無しさん
21/03/25 14:41:00.85 Vfj9f3xX.net
完全に(疑似)乱数でよいのなら、
毎回シード設定すれば入力で一意に決まる乱数値を取得できるけど、それでええのん?

10:デフォルトの名無しさん
21/03/25 14:43:13.48 Vfj9f3xX.net
例えばこんなの
srand(input);
return rand();

11:デフォルトの名無しさん
21/03/25 17:26:16.86 BFmdRR/m.net
ハッシュと乱数を混同して質問しているに500ペリカ

12:デフォルトの名無しさん
21/03/25 17:48:06.49 VH1J0VUJ.net
>>9
それですね
ちょっとその発想を元に作ってみます

13:はちみつ餃子
21/03/25 18:04:14.88 eNzfljpt.net
C++ の乱数生成器 (linear_congruential_engine, mersenne_twister_engine, subtract_with_carry_engine)
は厳密に挙動が定められているので環境によらず同じシードを与えれば同じ乱数列が得られることは保証される。
(余談だが分布生成器 (uniform_int_distribution など) は完全に同一の挙動は保証されない。)
rand は同じシードからは同じ乱数列になるという保証はあるけど、
他の環境に持って行ったとき (別の処理系を使ったとき) に同じになるという保証はない。
乱数の質についても保証がない。
必要な性質がよくわからんのだが、再現性・移植性が重要なら rand はあまりよくない。

14:デフォルトの名無しさん
21/03/25 21:06:48.96 VH1J0VUJ.net
自作のXorShiftでやってみようと思います
スレの流れがそんなに速くないようなので後にコードレビューでもお願いするかもです

15:デフォルトの名無しさん
21/03/26 07:33:40.04 YT9UBnI1.net
乱数表作るだけだろ
くだらん

16:はちみつ餃子
21/03/26 13:48:17.35 OLCpSFIZ.net
コードレビューつってもなぁ、
明らかに未定義を踏んでるとか間違った結果を出力をするとかならともかく、
インターフェイスが綺麗かとか命名が適切がとかいった要素は状況に依存するんで
そこらへんの前提を共有できている状態じゃないと
かなりざっくりした一般論しか言えないと思うよ。

17:デフォルトの名無しさん
21/03/26 14:17:07.80 xeE+mVbe.net
7ですが、すいませんでした
場違いだったようなのですべて撤回します

18:デフォルトの名無しさん
21/03/26 17:49:14.73 Bae43LUT.net
QZあたりが疑似乱数の理論について本一冊分ぐらい語るのではなかったの???

19:デフォルトの名無しさん
21/03/26 17:50:06.84 Bae43LUT.net
乱数表をどうやって作るつもりなのかとそこはかとなく疑問が………

20:デフォルトの名無しさん
21/03/26 19:01:34.23 Rskx+UE5.net
ラジウムとガイガーカウンターでも使うんだろ

21:デフォルトの名無しさん
21/03/26 20:57:56.27 Bae43LUT.net
ガイガーカウンターは放射線源が強力だとカウントミスりそうであんまり高速な乱数生成に向かない
という印象

22:デフォルトの名無しさん
21/03/26 22:44:42.48 Bae43LUT.net
ていうか量子乱数発生器はスタジアムや野球場など人間が数千人〜数万人規模で集まり
興奮するようなところで量子乱数発生器を使うと乱数発生が偏るという実験結果がある
とモーガンフリーマンが言ってたから信頼できない
やっぱ第一選択はシードを19936ビットフルい与えてのmersenne_twister_engineなのでは……

23:デフォルトの名無しさん
21/03/26 23:42:48.79 uaj8R912.net
ハッシュと乱数を混同してただけでしょ

24:
21/03/27 00:11:40.23 h1BsDCwR.net
>>17
大抵の用途には、私は MT を使いますね…

25:はちみつ餃子
21/03/27 00:35:45.49 Ly0w36WW.net
メルセンヌツイスタは統計的な性質は良いが状態がやや大きい (普通のパソコンではもはや気にしないでよいレベルだが) ので、
いつでも選択するには過剰な気もする。

26:デフォルトの名無しさん
21/03/27 00:52:36.37 tZBSsbg+.net
スレの流れをぶった切って申し訳ない
boostってもういらなくなったの?
15年ぶりにC++でプログラミングすることになったので
その辺の事情がよく分かりません

27:デフォルトの名無しさん
21/03/27 00:54:27.35 3iQ+aU3D.net
当然要るよ
多次元配列クラスとかまだSTLに入ってない

28:はちみつ餃子
21/03/27 01:11:01.48 Ly0w36WW.net
個別には Boost 以外の選択肢もあると思うけどある程度に統一されてないと扱いづらいし、
Boost にあるものは Boost を使っておくのが無難な選択には違いないと思うよ。

29:デフォルトの名無しさん
21/03/27 01:17:35.37 1M7dxEop.net
boostはヘッダライブラリ自称してる割にビルド必要で使いづらいねん

30:はちみつ餃子
21/03/27 01:26:03.40 Ly0w36WW.net
>>28
> ヘッダライブラリ自称
そんなことどこかに書いてあるの?
公式ページのトップにもビルドについて言及があるし、ヘッダのみみたいなニュアンスはないと思うんだが。

31:デフォルトの名無しさん
21/03/27 02:13:45.76 FxCpf6Ea.net
ヘッダのみで使えると過剰に宣伝してるライブラリが多い。
と、あわしろ氏が申しておりました。

32:デフォルトの名無しさん
21/03/27 02:17:07.41 p6NWEZH2.net
あわしろってキンコン西野みたいなもん?

33:デフォルトの名無しさん
21/03/27 08:19:32.12 MzcivD4R.net
ビルド必要なのは別にいいけどbjamが糞すぎるからさっさと捨てて欲しい

34:デフォルトの名無しさん
21/03/28 12:33:00.93 11viivYN.net
class hoge{
public:
constexpr static int aaa[2] = { 1, 2};
static hoge get_hoge();
}
hage::hage()
{
hoge *_hoge = hage::get_hoge();
int tmp;
int i = 0;
tmp = _hoge->aaa[i];
}
とすると、ビルド時、undefined reference to `hoge::aaa'と出るけど、
tmp = _hoge->aaa[0];とするとエラーが出ない
これってなぜ起きて、どうやったら変数を使ってアクセスできるようになるの?
開発環境はSTM32CubeIDEのver1.6.0

35:デフォルトの名無しさん
21/03/28 13:05:07.76 hha5l0Ce.net
ちらちら混ざってる hage は hoge の間違いなのか何か別物なのか。

36:はちみつ餃子
21/03/28 13:05:58.70 IQVnw+L7.net
>>33
サンプルコードが不足しているので何をどうしたいのかよくわからんのだが、
i が定数式じゃないと駄目だよ。

37:デフォルトの名無しさん
21/03/28 13:47:16.98 5/FvdRpo.net
>>35
うそやん?

38:デフォルトの名無しさん
21/03/28 17:41:23.48 11viivYN.net
>>34
hogeにはアプリで使う色々な定数が入ってて、hageがそれを参照するようにしてるんだ。
んなもんdefineでいいとかそういう話は置いといて、iが変数だと何がまずいの?

39:デフォルトの名無しさん
21/03/28 19:20:58.11 PRWHgvt6.net
三段活用はhoge、fuga、piyoだろ!常識だぞ
ハゲとか言う人にはもう教えません

40:デフォルトの名無しさん
21/03/28 19:23:19.81 YX9+FjRw.net
piyoは初めてみるな

41:デフォルトの名無しさん
21/03/28 20:20:31.89 W2vCV6FV.net
>>39
それなりに知られてるぞ
URLリンク(ja.m.wikipedia.org)

42:デフォルトの名無しさん
21/03/28 21:37:33.38 hha5l0Ce.net
>>37
> constexpr static int aaa[2] = { 1, 2};
クラススコープの↑は変数の定義に見えるけど実は宣言でしかなくて、プログラム中に実体を置くには別途定義が要る。
ただし const な整数型や constexpr な変数が定数式の文脈で即座に値として利用される場合はコンパイル時に直接定数として
置き換えられるので、定義が無くてもビルドできる。
定数 0 ではなく変数 i を添え時にすると定数式ではなくなるので定義が必要になる。

43:デフォルトの名無しさん
21/03/28 22:16:07.85 11viivYN.net
>>42
分かったようなわかんないような感じなんだけど、
例えば、
class hoge{
public:
constexpr static int aaa[2];
static hoge get_hoge();
}
hoge::aaa[2] = {1, 2};
みたいにするってこと?

44:デフォルトの名無しさん
21/03/28 22:26:27.67 hha5l0Ce.net
>>42
それだと定数評価できなくなるから、たぶんやりたいことと違うよね。
「別途定義」は、宣言の初期化子はそのままで↓をどこかのコンパイル単位に追記するだけでいい。
constexpr int hoge::aaa[];

45:デフォルトの名無しさん
21/03/28 22:50:05.31 R4xh1GwG.net
static constexpr int * constexpr aaa = …

static inline constexpr int aaa[] = … (c++17)
で行けんじゃね?知らんけど。

46:デフォルトの名無しさん
21/03/28 23:57:42.15 hha5l0Ce.net
そういえば inline 変数で済むようになったんだっけ。 C++17 でビルドすれば別途定義は要らないね。
URLリンク(cpprefjp.github.io)

47:デフォルトの名無しさん
21/03/29 08:44:37.72 A8t4nM4q.net
これで思い出したんだけどメンバ変数のconstexprとstatic constexprに違いってあるんだっけ?

48:デフォルトの名無しさん
21/03/29 10:42:44.85 4VjYBAI0.net
メモリ上に唯一ここだけしかないんだぞって見る奴に分かるようにしてるんでしょ
コンパイラ的にはあってもなくても同じ

49:デフォルトの名無しさん
21/03/29 11:13:21.97 a9nDQaAf.net
>>46
メンバ変数はインスタンス無いとあかんやん

50:46
21/03/29 11:39:07.94 jFqdjOB1.net
インスタンスごとになるのか・・コンパイル時定数なのに(保証は無いのかもしれんけど
普段staticつけてるから疑問に思ってたんだ、ありがとう

51:デフォルトの名無しさん
21/03/29 16:52:43.90 ZAtZtNlj.net
>>43
thx
C++の仕様が古いのか分からんけどうまくいかなかったんで、constで宣言して別に定義したわ

52:デフォルトの名無しさん
21/04/01 00:44:40.92 3rw8Xzm0.net
クラスを使わずにフリー関数だけで何もかも実装してしまう

53:はちみつ餃子
21/04/01 02:23:28.90 zgIDekUq.net
なんでもかんでもクラスに放り込むのは良くないというのはよく認識されるようになってきたみたいだけど、
だからといって C++ を使う以上は非メンバ関数だけで構成するのも不格好だし、いい感じの設計は難しいね。

54:デフォルトの名無しさん
21/04/01 05:45:44.25 KfB45e5F.net
知らん馬の骨の好みに合わせる意味はない

55:デフォルトの名無しさん
21/04/01 06:17:26.46 xkKFGoH+.net
無駄に上から目線でワロタ
何様のつもりなのかと

56:デフォルトの名無しさん
21/04/01 11:54:02.32 /m7p4qXu.net
バカが無理してクラス使っても無駄に状態持つだけだから非メンバ関数使っとけ

57:デフォルトの名無しさん
21/04/01 14:49:39.84 mwubpVbO.net
ラムダ式で何もかも実装したらクラスを使ったことになる!

58:デフォルトの名無しさん
21/04/01 16:14:27.54 b0+JHWqP.net
>>38
hoge
hage
mage
かと思ってた

59:デフォルトの名無しさん
21/04/01 16:49:21.83 Ga8mQY/B.net
>>55
永遠に初心者のままだな

60:デフォルトの名無しさん
21/04/01 17:27:07.05 mwubpVbO.net
>>58
別に

61:デフォルトの名無しさん
21/04/01 18:40:51.78 /m7p4qXu.net
>>58
永遠に関数型理解できないね

62:はちみつ餃子
21/04/01 18:42:28.20 zgIDekUq.net
メンバ関数を使わなければ関数型的ということはない。

63:デフォルトの名無しさん
21/04/01 18:48:20.10 /m7p4qXu.net
嫌味の理解できない奴が話をこじらせる。

64:デフォルトの名無しさん
21/04/01 22:02:12.44 mwubpVbO.net
誤解の余地がないぐらいしっかり要件定義できたら一人前の入り口

65:デフォルトの名無しさん
21/04/01 23:10:26.56 klwu+MWY.net
なんでもかんでもクラスに放り込むのは良くないけど、なんでもかんで名前空間に放り込むのは実に良い

66:デフォルトの名無しさん
21/04/02 01:40:11.97 UoCieKPr.net
ま、せやな

67:デフォルトの名無しさん
21/04/02 08:19:46.74 U50iDt4R.net
"Raw string literals" は 「生文字列リテラル」 って訳されるけど、「生」の部分をどう読んでいるのですか?
「なま」なのか「せい」なのか、「しょう」なのか
ググってもわかりません
URLリンク(cpprefjp.github.io)

68:デフォルトの名無しさん
21/04/02 08:32:50.23 /UxsPKSF.net
「生ポインタ」で「なまぽいんた」
界隈で使われてる超専門用語
教科書には読み方はおろかその存在すら一切載って無い
しかしてC/C++使いは総じてその読み方を知ってる

69:デフォルトの名無しさん
21/04/02 08:39:51.40 U50iDt4R.net
>>67
「なま」なんですね
早速の解答ありがとうございます m(_ _)m

70:デフォルトの名無しさん
21/04/02 13:54:33.57 6+Rf0OKV.net
einsumとか添字の入れ替えくらいの本当に基本的な機能だけ持ってる多次元配列クラスがほしいんだけど、なんでこれしきのものがboostにはないの?

71:デフォルトの名無しさん
21/04/02 14:03:29.72 q3Egk2LJ.net
君の実装を世界が待ってるんだぞ
文句言う前に公開せよ

72:デフォルトの名無しさん
21/04/02 14:19:38.24 6+Rf0OKV.net
>>70
今は自分で実装して騙し騙し使ってるけど、こういうファンダメンタルかつパフォーマンスが必要なものは誰か信用できるプロバイダに作ってほしい

73:デフォルトの名無しさん
21/04/02 17:28:33.51 65VwiNme.net
実用的な必要に迫られている人こそ
変な妥協もお花畑なオーバースペックもない
機能美なコードを書けるんだけどな

74:デフォルトの名無しさん
21/04/02 19:20:37.25 OIYek4iX.net
>>72
実用的なコードというのは進化し続けるコードであって、常に古びた無駄を抱えているもんだ。

75:デフォルトの名無しさん
21/04/03 03:21:26.87 YT89Uc9u.net
仕様変更できなくなって陳腐化していくことはあるな

76:デフォルトの名無しさん
21/04/03 06:35:59.59 FsaMqi3u.net
std::vector<bool>のpopcountを簡単にとる方法をおしえてくだちい
以下のようにして自力で数えるしかない?
size_t popcount(const std::vector<bool>& vec) {
size_t cnt = (size_t)0;
for (auto it = vec.begin(); it != vec.end(); it++) {
if ((bool)(*it)) {
cnt++;
}
}
return cnt;
}
あとstd::vector<bool>::size()は総ビット数を返すみたいなんですが
では実際に占有しているヒープのサイズは
どうやって確かめたら良いんでしたっけ……_○/|_

77:デフォルトの名無しさん
21/04/03 07:04:05.36 FsaMqi3u.net
つかstd::count(vec.begin(), vec.end(), true)で一応動くみたいけど
中でbool型の等値判定していると思うんですが問題無いんでしたっけ……

78:デフォルトの名無しさん
21/04/03 07:45:13.57 lohjPiFl.net
不安だったらvector<bool>なんか使うな
それは素人が手を出していいものじゃない

79:デフォルトの名無しさん
21/04/03 09:24:55.78 FsaMqi3u.net
集合表現のためのビットマップのロジックを新たに新規に作るよりマシ、
という天才の判断

80:デフォルトの名無しさん
21/04/03 12:58:35.52 cvW9PgHj.net
std::bitsetじゃいかんのか?

81:デフォルトの名無しさん
21/04/03 13:23:18.30 FsaMqi3u.net
天才か!
しかしstd::bitsetは要素数が整数の基本型のビット数を超えられないのでは……

82:デフォルトの名無しさん
21/04/03 13:33:00.76 3ynmntXR.net
要素数が本当に動的に変わるの?

83:デフォルトの名無しさん
21/04/03 13:49:31.61 5dv7xI+Y.net
2^32以上のサイズが必要だってこと?
何に使うの?

84:デフォルトの名無しさん
21/04/03 13:51:40.21 FsaMqi3u.net
>>82
誤: 2^32
正: 32
当然32個以上の要素からなる集合をビットマップ式に表そうとしたとき
、整数の基本型1個では足りない

85:デフォルトの名無しさん
21/04/03 13:52:40.69 rmK5g90q.net
int128の整数を使えば

86:デフォルトの名無しさん
21/04/03 13:52:47.30 FsaMqi3u.net
訂正orz
誤: 当然32個以上の要素からなる集合
正: 当然64個を超える要素からなる集合

87:デフォルトの名無しさん
21/04/03 14:04:02.94 5dv7xI+Y.net
>>80
え?普通に32超えられるけど

88:デフォルトの名無しさん
21/04/03 15:15:47.45 62Tyvx2d.net
何かこういう訳のわからない事を書き込んでまで質問するならもっとわかりやすく書けよと思う
そもそも動的じゃないなら配列でええやろ

89:デフォルトの名無しさん
21/04/03 17:28:40.18 0zCBAqiq.net
c++関係あるかわかりませんが、テクスチャをバラバラに分割するロジックってどうやって作るんでしょうか?
例えばジグソーパズルや、このモザイク画のように、1枚の絵をバラバラにしたいのです。
ばらばらにしたものを戻すというゲームを作ろうとしています。
URLリンク(docs.gimp.org)
これが作成したサンプル画像です
URLリンク(i.imgur.com)
グリッドの線がうっすら見えると思いますが、これを2次元配列とみなします。
適当に四角形を選択して、大まかな位置を決めます。
しかし、その後、四角形を三角形や五角形にするにはどうしたらいいのでしょうか?
隣り合う頂点をマージするなどすればできそうですが。
つまり、頂点という概念を使わないとこの機能は実現出来ないでしょうか?
板ポリゴンを2dとして映せば行けるかなと思ってます。
まあ、inkscapeなどで手作業で作れよって話ですけどね。
自動でパズル作ってくれたらいいなと思って。
エンジンはgodotです(´・ω・`)が、processingなどの環境でもいいです。
ヒントください

90:デフォルトの名無しさん
21/04/03 17:42:25.44 5dv7xI+Y.net
1ドットずつ走査して近似色以外は透明色で塗りつぶせば

91:デフォルトの名無しさん
21/04/03 17:43:36.15 Hj8nCIUt.net
>>88
こういう話? C++ は関係なさそう。
URLリンク(ja.wikipedia.org)
gimp のプラグインになってるんならソースありそうだからそれ見ればいいんじゃねとも思う。

92:デフォルトの名無しさん
21/04/03 18:06:49.53 XWE78oAN.net
OpenGLとかグラフィックプログラミング系のスレで聞くべき・・といいたいところだが
この板は上から下まで、やれこっちが優れてるだのこのやりかたは汚いだの
アホみたいなマナー・作法論しか議論していない板なのでたぶん書籍かWebを検索したほうがいい

93:デフォルトの名無しさん
21/04/03 18:11:14.04 FsaMqi3u.net
適当に点{ p1, p2, p3, ... } をばらまいてボロノイ境界を描いたら
ボロノイ境界が勝手に種々の多角形になりまくり……!
あとは1つの区画内を点{ p1, p2, p3, ... }における画像の色とかの
適当な色で塗り潰せば良い
言うは安し……!!

94:デフォルトの名無しさん
21/04/03 22:25:01.27 M/dPb3y2.net
とりあえず2Dゲーをいちいちポリゴンでやるのはやめといた方がいいかも・・
テクスチャの内容を一枚のビットマップとしていじった方が楽な気がする
スワイプやドラッグでピースを動かすときは板ポリ使ってもいいかもしれんけど

95:デフォルトの名無しさん
21/04/04 10:32:13.85 b5JcZ1t5.net
>>89
その機能がゲームエンジンにあるかどうかすで
>>90
そんな感じですね。
ボロノイというより、三角と四角と五角形で分割したいわけですが
openglはできませんからね、擬似的にそう見せる方法でもいいのですが
アホなので

96:デフォルトの名無しさん
21/04/04 10:37:45.94 b5JcZ1t5.net
>>93
ビットマップでやるってのは、マスでなんとかするってことですか?

97:デフォルトの名無しさん
21/04/04 10:58:31.72 xtAOreBW.net
領域を分割する頂点と辺を決めたらあとは各ピクセルごとにどの領域に含まれるかを判断すればいいように思うが

98:デフォルトの名無しさん
21/04/04 13:16:57.18 Qg2Ccl1w.net
>>88のサンプル画像からすると、分割された領域の頂点は格子点上にないといけないっぽい
ボロノイ境界の交点は都合良く格子点上に来るとは限らないから、ボロノイ「領域」
の作図式にやるのはいろいろな点でイマイチ感が、

99:デフォルトの名無しさん
21/04/04 13:46:45.93 Qg2Ccl1w.net
ちゅか要件定義的に(三角形は良いとして)
(1) 四角形や五角形への分割において凹図形を許容するのか否か
(2) ある図形の1つの辺を2つ以上の隣接図形で共有することを許容するのか否か
とか決めねばならない
いや決めたからといって別に頂点決定アルゴリズムの妙案とか無いが_○/|_

100:デフォルトの名無しさん
21/04/04 18:57:03.43 b5JcZ1t5.net
ここは飛ばしてゲーム作ります(´・ω・`)、、、別に面白さと関係ないしね、、、。

101:デフォルトの名無しさん
21/04/04 19:04:13.20 b5JcZ1t5.net
processingで似たような事できますか?ちょこちょこ練習しようかな
ゲームエンジン使うほどでもないので
URLリンク(processing.org)
これダウンロードできます?寄付しろと言われるんですけども

102:デフォルトの名無しさん
21/04/04 19:10:44.91 b5JcZ1t5.net
できた すみあmせん

103:デフォルトの名無しさん
21/04/05 08:59:16.68 8ugS0e8D.net
c++言語をググるとビャーネも必ず出てきて
彼が設計者だとのことですが、コンパイラを作ってるのは彼ではないですよね
具体的に彼は何をしたの?

104:デフォルトの名無しさん
21/04/05 09:24:06.09 YIdyLrea.net
言語仕様の策定だろ
まあ最初のコンパイラー(コンバーターかも)ぐらいは作ってるとは思うけど

105:デフォルトの名無しさん
21/04/05 09:27:14.80 cScuzdm0.net
当初はCのプリプロセッサだから今で言うとTypescriptみたいなものだな

106:デフォルトの名無しさん
21/04/05 11:51:16.82 zIvWtxBS.net
C++標準化委員会は誰が組織したんや?

107:デフォルトの名無しさん
21/04/05 11:53:41.43 zIvWtxBS.net
それとも国際標準化機構(ISO)か何かの配下なの?

108:デフォルトの名無しさん
21/04/05 12:36:06.42 ESZTLEZZ.net
>>105
K&R Cにクラスの概念を取り入れて見よう
ということを思いつきcfrontを実装した
TC++PL及びARMを著しC++を広く世界に知らしめた

109:デフォルトの名無しさん
21/04/05 17:28:39.12 2Tvboykg.net
そして世界は闇と混沌に包まれた……

110:デフォルトの名無しさん
21/04/05 19:55:46.69 rNcivJgw.net
c++はクソだが、プログラマが求めたクソなのだ。

111:デフォルトの名無しさん
21/04/05 22:13:27.34 zIvWtxBS.net
URLリンク(livedoor.blogimg.jp)

112:デフォルトの名無しさん
21/04/05 22:24:25.87 vDuR7coO.net
ビヨーン先生の功績は
ハゲても立派なプログラマになれるという勇気をくれたことだろう

113:デフォルトの名無しさん
21/04/06 06:59:06.97 rUOwZVXJ.net
質問ですが
 std::vector<SomeBigObject> arr;
 std::vector<int> indices;
というデータがあり、
SomeBigObjectは大小比較可能だがarr自体は未ソートで、
 for (int i = 0; i < N; i++) { indices[i] = i; }
 auto cmpFunc = [](int a, int b)->bool{ return (arr[a] < arr[b]); }
 std::sort(indices.begin(), indices.end(), cmpFunc);
としてindices上で間接的にソートされているとき、
指定されたSomeBigObject x以上の値が現れるarr[i]の最小のiを高速に取得するには
どうづればSTLでやるには良いですのん?

114:デフォルトの名無しさん
21/04/06 06:59:22.44 rUOwZVXJ.net
arrがソートされていれば
 auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
 std::lower_bound(arr.begin(), arr.end(), cmpFunc2);
で済む話なんだども、SomeBigObjectはコピーの手間がかかるので直接std::sortしたくないという、

115:デフォルトの名無しさん
21/04/06 07:00:25.45 rUOwZVXJ.net
また手動で組めということなら明らかに組める
int custom_lower_bound(int bgn, int end, const int N, const SomeBigObject& x) {
 while (bgn < end) {
  int mid = bgn + (end - bgn) / 2;
  if (arr[mid] < x) {
   bgn = mid;
  } else if (x < arr[mid]) {
   end = mid;
  } else {
   while (mid > 0 && arr[mid - 1] == x) { mid--; }
   return mid;
  }
 }
 while (bgn < N && arr[bgn] < x) {
  bgn++;
 }
 return bgn;
}
みたいなことをしたら多分逝けるが、しかしこんなもん使う都度書きたくないし、
ライブラリとして展開して責任負いたくもないんじゃー
STLはこういうケースのためにあり、論理的に実現できる以上やり方が考えられていないとおかしいはず……

116:デフォルトの名無しさん
21/04/06 07:42:07.19 w+lldWjr.net
 auto cmpFunc3 = [](int a, int b)->bool{ return (arr[a] < arr[b]); }
 i = std::lower_bound(indices.begin(), indices.end(), cmpFunc3);
arr[i];
じゃいかんのかしら

117:デフォルトの名無しさん
21/04/06 15:08:28.23 rUOwZVXJ.net
>>115
lower_bound()の第3引数に検索キーxを指定する必要があるから
>>115では解決しないっていうかビルドエラーなヨカン、
ここで気づいたが>>113のlower_bound()の例は間違ってたわスマン、orz
↓これに訂正
 auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
 std::lower_bound(arr.begin(), arr.end(), x, cmpFunc2); // 3番目の引数は検索キーx
ところがソートされているindices上の検索キーは、検索したい実際のオブジェクトxから
ただちには求められない(普通にやったら線形探索の手間がかかる、。n_

118:デフォルトの名無しさん
21/04/06 17:08:29.35 mAZMW+WU.net
 auto cmpFunc3 = [&](int idx, const SomeBigObject& xx)->bool{ return arr[idx] < xx; }
 auto i = std::lower_bound(indices.begin(), indices.end(), x, cmpFunc3);
arr[*i];
じゃあこれで

119:デフォルトの名無しさん
21/04/06 18:31:21.10 rUOwZVXJ.net
>>117
ムリス、
つか次のように死ぬほど腐った書き方をしたらとりあえずできるた、
/// 間接ソート版lower_bound
int custom_lower_bound(const std::vector<SomeBigObj>& arr, std::vector<int>& indices, const SomeBigObj& x)
{
 // SomeBigObjの間接ソート用比較関数
 // xのコピーを避けるため[&](a, b)とする。
 auto cmpFunc = [&](const int a, const int b)->bool {
  // 有り得ないindex値が渡ってきたらxとみなす。
  const SomeBigObj& obj1 = (a < 0) ? x : arr[a];
  const SomeBigObj& obj2 = (b < 0) ? x : arr[b];
  return (obj1 < obj2);
 };
 // lower_bound()の第3引数(検索キー)を有り得ないindex値にしておく。
 auto found_it = std::lower_bound(indices.begin(), indices.end(), -1, cmpFunc);
 // Indexに変換
 return (int)std::distance(indices.begin(), found_it);
}
動作するサンプル例:
URLリンク(ideone.com)

120:デフォルトの名無しさん
21/04/07 00:39:13.23 C05ugDVV.net
const int lb = std::distance(indices.begin(),std::partition_point(indices.begin(), indices.end(), [&x,&arr](const int i){ return arr[i] < x; }));
これでどうかな?

121:デフォルトの名無しさん
21/04/07 01:13:46.41 B+YGKOyD.net
>>115
エピさんかしらん

122:デフォルトの名無しさん
21/04/07 01:17:07.25 KcAzRCeR.net
>>118
動くってば
URLリンク(ideone.com)

123:デフォルトの名無しさん
21/04/07 05:42:50.50 FlnHFJBF.net
>>121
しらそん
おま環

124:デフォルトの名無しさん
21/04/07 06:26:08.77 hpqJGpH8.net
>>122
動かないのをおま環言うのはよく聞くがその逆を聞いたのはこれが初めてかも

125:デフォルトの名無しさん
21/04/07 07:24:58.99 FlnHFJBF.net
確かに動いているように見えるが(呼び出し回数も2分探索相当に見えるが)
Compにそんな引数渡して委員会?!
錯覚じゃないの;;;

126:デフォルトの名無しさん
21/04/07 08:00:02.53 FlnHFJBF.net
std::lower_bound(first last, value, comp);
という呼び出しにおいて、compはcomp((firstやlastと同じ型のiteratorが指す要素), value)
という呼び出され方しかされないこと、および
valueの型はfirstやlastが指す要素の型とま無関係に好きな型にして良いと規格で決まっている?!

127:デフォルトの名無しさん
21/04/07 09:20:20.01 F9L3hm15.net
チラッと規格見た限り
value は first、last と無関係でいいし
comp の第一引数はfirst、lastのiteratorが指す型で、第二引数はvalueの型に決まっているように見える

128:デフォルトの名無しさん
21/04/07 12:44:59.78 94shRdbf.net
>>51じゃないが、オブジェクト指向で設計する意味が分からなくなった
汎用性の高いフリー関数が沢山あればそれで良いじゃん

129:デフォルトの名無しさん
21/04/07 15:37:37.40 2guWvkPP.net
>>126
> comp の第一引数はfirst、lastのiteratorが指す型で、第二引数はvalueの型に決まっているように見える
そこは決まってないと思う。

130:デフォルトの名無しさん
21/04/07 15:42:26.98 2guWvkPP.net
・・・いや、 lower_bound() 限定なら引数の順番もその想定でいいのか。
upper_bound() だと comp(value, x) になったりするから、交換可能にしとくのがいいけど、
片方だけ使うなら交換可能にする必要はない、と。

131:デフォルトの名無しさん
21/04/07 15:44:08.41 2guWvkPP.net
参照: URLリンク(timsong-cpp.github.io)

132:デフォルトの名無しさん
21/04/07 15:45:24.56 x8RK+cZQ.net
>>128
requiresのとこは見た?

133:デフォルトの名無しさん
21/04/07 17:04:44.94 x8RK+cZQ.net
c++20からprecond


134:itionsって書き方に変わったのか。 >>129 upper_boundのpreconditionsには第一引数がvalueのほうしか書いてないよ



135:デフォルトの名無しさん
21/04/08 06:24:25.70 ByNsu0yr.net
質問者ですレスdクス、
>>117の書き方で>>121が正しく動いているように見えるのは未定義動作でなくてSTLの仕様ってことでFA?
>>126>>129のような巧妙っていやー巧妙だが風が吹いたら桶屋が儲かるみたいなかりにくい仕掛けなのは
ステパノフあたりの発案なんですかね……

136:デフォルトの名無しさん
21/04/08 10:00:06.97 b/WIqkut.net
>>132
あ、ごめん。比較関数の引数順を交換可能にするのは lower_bound, upper_bound 両用にすることを想定しての話。

137:デフォルトの名無しさん
21/04/08 16:09:17.02 uZSkMyuO.net
生魚にあたって、
入院した病院の天井みながらSTL考えてたもんな

138:デフォルトの名無しさん
21/04/08 16:25:55.36 /Z+9yHN3.net
ステパノフ?

139:デフォルトの名無しさん
21/04/08 23:02:01.67 6aXKgzGP.net
ニダーランが終了になるそうだ
もう糞スレは立てにくくなるな
ざまあ

140:デフォルトの名無しさん
21/04/09 01:15:08.43 iqXbiQSS.net
>>135
STLなんてかっこつけたネーミングだけど
やってることはリニアサーチwww

141:デフォルトの名無しさん
21/04/09 11:44:34.26 B1MFSAev.net
C++11でのstd::swapは、次のようなコードになっているそうですが、
仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
仮にt1のポインタ的なメンバにnullptr的なものが代入されない場合、
(2)でt1への代入に置いて何が起きるのか心配です。
質問の仕方を変えるならば、
share_ptrは参照カウンタ方式ですのでカウンタのアップ/ダウンは正確でなければ
なりませんが、以下の例では、いったいどの行のどの演算子(またはどの部分)で
カウントアップ/カウントダウンされるんでしょうか。
template<typename T> void swap(T& t1, T& t2) {
 T temp = std::move(t1); // (1), or T temp(std::move(t1));
 t1 = std::move(t2);   // (2)
 t2 = std::move(temp);  // (3)
}

142:デフォルトの名無しさん
21/04/09 11:45:42.89 B1MFSAev.net
>>139
誤:仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
  nullptr的なものが代入されるんでしょうか。
正:(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
  nullptr的なものが代入されるんでしょうか。

143:デフォルトの名無しさん
21/04/09 11:58:14.49 O38yN+C3.net
>>138
C++03にもstd::binary_searchあるぞ

144:はちみつ餃子
21/04/09 12:00:21.75 foJJo5gI.net
>>139
> nullptr的なものが代入されるんでしょうか。
この場合はされる。
ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
> いったいどの行のどの演算子(またはどの部分)で
> カウントアップ/カウントダウンされるんでしょうか。
= がその役割を持っている。
ムーブコンストラクタとムーブ代入演算子によってカウントされる。

145:デフォルトの名無しさん
21/04/09 12:02:12.29 B1MFSAev.net
>>140
どうやら、
(1) の中央の = では、TからTへの move-construc


146:torが呼び出され、 (2)や(3) の中央の = では、TからTへの move-assignment operatorが呼び出される、 ということのようですが、 Tのmove-contructorやmove-assingment operatorは、ユーザーの実装次第で、 ユーザーがそれらを明示的に書かなかった場合の「デフォルトの定義」は 現在もまだ論争中で、標準的な仕様が決まってない、ということらしいですね。 間違っていれば指摘してください。



147:デフォルトの名無しさん
21/04/09 12:11:46.34 fGHst4+7.net
>>141
そんなのも、ちょっとc\c++をかじったことあるなら
誰でも書けるじゃん
わざわざ誰が書いたかわからないようなものより自作できるなら自作するだろ

148:デフォルトの名無しさん
21/04/09 12:20:57.67 QYkH8yRN.net
>>143
以下のサイトによれば、「標準的な仕様は決まっている」ようです:
drafet C++11 standareのsection 12.8のparagraph 15に
implicitly-defined copy/move constructor は、
「a memberwise copy/move of its bases and members」
であると書いてあるそうですから:
URLリンク(stackoverflow.com)

The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members. [ Note: brace-or-equal-initializers of non-static data members are ignored. See also the example in 12.6.2. —end note ] The order of initialization is the same as the order of initialization of bases and members in a user-defined constructor (see 12.6.2). Let x be either the parameter of the constructor or, for the move constructor, an xvalue referring to the parameter. Each base or non-static data member is copied/moved in the manner appropriate to its type:
if the member is an array, each element is direct-initialized with the corresponding subobject of x;
if a member m has rvalue reference type T&&, it is direct-initialized with static_cast(x.m);
otherwise, the base or member is direct-initialized with the corresponding base or member of x.
Virtual base class subobjects shall be initialized only once by the implicitly-defined copy/move constructor (see 12.6.2).

149:デフォルトの名無しさん
21/04/09 12:39:59.46 QYkH8yRN.net
>>142
>ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
>標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
>メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
なるほど。
行(1)の場合、
1. 右辺でstd::move()をt1に行った段階では(実行段階で)マシン語は全く実行されない。
2. 中央の = は、move-constructor と解釈され、Tのmove-constructorが呼び出される。
3. Tの暗黙定義のmove-constructorは、メンバ同士のmove-construcotrなので、
 メンバに shared_ptr<A> a があると、shared_ptr<A>のmoveコンストラクタが呼び出される。
 そして、shared_ptr<A>のmoveコンストラクタは、実行後に「src側(from側)」をnullptr相当の
 状態にしてしまう。
ということのようですね。

150:デフォルトの名無しさん
21/04/09 12:42:08.46 QYkH8yRN.net
>>146
逆に言えば、Tのメンバに、A *pA; のような生ポインタがあると、
Tの暗黙のmoveコンストラクタ/move代入演算子では、恐らく、
「src側(from側)」にはnullptrが代入されない(??)ので、非常に困った
問題を招くかも知れないと?

151:デフォルトの名無しさん
21/04/09 12:44:10.41 QYkH8yRN.net
>>147
Tのデストラクタに
if ( pA != nullptr ) {
 delete pA;
}
などと書いていた場合、問題を生じそうですね。

152:デフォルトの名無しさん
21/04/09 12:45:44.21 iOouO9yu.net
生ポ入りクラスに暗黙move関数定義できたっけ?

153:デフォルトの名無しさん
21/04/09 18:46:49.83 WYvZUx+H.net
c++についてうんちく垂れるやつに限って仕事ができない
そんなうんちくどうでもいいから、さっさと作れよって思われてる先輩いるわ

154:デフォルトの名無しさん
21/04/09 19:06:14.56 PF0aPDJN.net
>>150
プログラマは怠惰であれ、を地で行ってるんだろう

155:デフォルトの名無しさん
21/04/09 19:55:10.43 O38yN+C3.net
>>144
> わざわざ誰が書いたかわからないようなものより自作できるなら自作するだろ
おまえは一生二度とライブラリもOSも使うな
ベアメタルだけで食っていけ
それができたら、おまえに付いてくる者たちが顕れるだろう
できなければ人知れず消えるだけだ
どうなりたいかは、お前の人生だ
俺がどうしろとは言えない

156:デフォルトの名無しさん
21/04/09 20:38:18.09 8YMfBGcF.net
>>150
またお前か。さっさとプログラミング覚えろよ

157:デフォルトの名無しさん
21/04/09 23:03:48.36 mQjFjskh.net
std::binary_search()は戻り値とかなんとboolや
こんなのよかちゃんと位置を返してくれるstd::lower_bound()の方がよっぽど使いでがある
ちなstd::lower_bound()が2分探索か線形探索かは使うイテレータの条件次第

158:デフォルトの名無しさん
21/04/09 23:08:01.53 mQjFjskh.net
std::lower_bound()が線形探索だと断言してくださる香ばしいblogも世の中にはあるが
https://rsk0315.hatenablog.com/entry/2019/09/10/173708
これがまつがいであることは比較関数の中でprintf()でもしたらたちどころにワカル

159:デフォルトの名無しさん
21/04/09 23:29:26.43 mQjFjskh.net
ゴメソリンク先は必ずしも断言はしていなくって、std::set<T>にstd::lower_bound()を適用する例か、
これのイテレータはrandom-access iteratorでないから確かに線形探索になる

160:デフォルトの名無しさん
21/04/10 02:28:09.12 +Yr/nSyJ.net
>>144
こういうのが井の中の蛙ってのだな
蛙くん

161:デフォルトの名無しさん
21/04/10 13:02:03.74 62UJIlpX.net
>>149
生ポインタのメンバ変数がある場合で、デストラクタで>>148のように
書いている場合は、暗黙のmove関数は自動定義されないようです。
なぜなら、暗黙のmove関数は、デストラクタがユーザー定義されている
場合には自動定義されないためです。
他にも、コピーコンストラクタ、コピー代入演算子、move代入演算子
がユーザー定義されている場合も、暗黙のmove関数は自動定義されない
そうです。

162:デフォルトの名無しさん
21/04/10 13:04:24.60 ziRUnSTY.net
>>158
誤:暗黙のmove関数
正:暗黙のmove-コンストラクタ

163:デフォルトの名無しさん
21/04/11 21:20:47.36 aRgjPq06.net
コンパイラはともかくリンカに計算負担をかけるのはバカな設計だなと思うわ。

164:デフォルトの名無しさん
21/04/11 21:31:53.64 X3ahc6YE.net
>>160 何の設計の話?

165:デフォルトの名無しさん
21/04/11 22:03:18.21 oDlLzjRc.net
暗黙のmoveがnullptr代入してくれないとか生ポあるクラスに暗黙のctor定義してくれるのか、とか
学ぶ順番間違えて勘違いしてるやつ上の方にいるけど
そもそも生ポの扱いに言語が介入するんならdtorでdeleteしてくれるのか、とか考えつかないのかね・・

166:デフォルトの名無しさん
21/04/11 22:28:21.28 AbYQFAoI.net
質問者はポインタ型とshared_ptrについて聞いてたのに、shared_ptrのことしか答えなかった餃子が悪い。
謝れ!俺に

167:デフォルトの名無しさん
21/04/12 13:47:17.66 SAslKmLH.net
指定ソフトのFWを許可するAPI教えてくださいよ

168:はちみつ餃子
21/04/12 15:59:50.47 8pnQviW4.net
そうか。

169:デフォルトの名無しさん
21/04/12 18:14:36.03 jbHGiSQO.net
皆さま御機嫌よう、ちょっと質問させてください
class hogeの内部でenum class fugaを定義し、
そのfugaをclass hogehoge でメンバ変数として使用したいのですが、
hogehoge のヘッダーにはなるべくhoge をインクルードさせたくありません。
もちろんfuga変数はヘッダーに置いて使用したいのですが



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

286日前に更新/299 KB
担当:undef