※前スレ
C++相談室 part154
https://mevius.5ch.net/test/read.cgi/tech/1610096040/
テンプレここまで
探検
C++相談室 part155
■ このスレッドは過去ログ倉庫に格納されています
2021/03/24(水) 12:07:15.39ID:R+oM8cup
2021/04/03(土) 13:51:40.21ID:FsaMqi3u
2021/04/03(土) 13:52:40.69ID:rmK5g90q
int128の整数を使えば
2021/04/03(土) 13:52:47.30ID:FsaMqi3u
訂正orz
誤: 当然32個以上の要素からなる集合
正: 当然64個を超える要素からなる集合
誤: 当然32個以上の要素からなる集合
正: 当然64個を超える要素からなる集合
2021/04/03(土) 14:04:02.94ID:5dv7xI+Y
>>80
え?普通に32超えられるけど
え?普通に32超えられるけど
2021/04/03(土) 15:15:47.45ID:62Tyvx2d
何かこういう訳のわからない事を書き込んでまで質問するならもっとわかりやすく書けよと思う
そもそも動的じゃないなら配列でええやろ
そもそも動的じゃないなら配列でええやろ
88デフォルトの名無しさん
2021/04/03(土) 17:28:40.18ID:0zCBAqiq c++関係あるかわかりませんが、テクスチャをバラバラに分割するロジックってどうやって作るんでしょうか?
例えばジグソーパズルや、このモザイク画のように、1枚の絵をバラバラにしたいのです。
ばらばらにしたものを戻すというゲームを作ろうとしています。
https://docs.gimp.org/2.8/ja/plug-in-mosaic.html
これが作成したサンプル画像です
https://i.imgur.com/abyDlBI.png
グリッドの線がうっすら見えると思いますが、これを2次元配列とみなします。
適当に四角形を選択して、大まかな位置を決めます。
しかし、その後、四角形を三角形や五角形にするにはどうしたらいいのでしょうか?
隣り合う頂点をマージするなどすればできそうですが。
つまり、頂点という概念を使わないとこの機能は実現出来ないでしょうか?
板ポリゴンを2dとして映せば行けるかなと思ってます。
まあ、inkscapeなどで手作業で作れよって話ですけどね。
自動でパズル作ってくれたらいいなと思って。
エンジンはgodotです(´・ω・`)が、processingなどの環境でもいいです。
ヒントください
例えばジグソーパズルや、このモザイク画のように、1枚の絵をバラバラにしたいのです。
ばらばらにしたものを戻すというゲームを作ろうとしています。
https://docs.gimp.org/2.8/ja/plug-in-mosaic.html
これが作成したサンプル画像です
https://i.imgur.com/abyDlBI.png
グリッドの線がうっすら見えると思いますが、これを2次元配列とみなします。
適当に四角形を選択して、大まかな位置を決めます。
しかし、その後、四角形を三角形や五角形にするにはどうしたらいいのでしょうか?
隣り合う頂点をマージするなどすればできそうですが。
つまり、頂点という概念を使わないとこの機能は実現出来ないでしょうか?
板ポリゴンを2dとして映せば行けるかなと思ってます。
まあ、inkscapeなどで手作業で作れよって話ですけどね。
自動でパズル作ってくれたらいいなと思って。
エンジンはgodotです(´・ω・`)が、processingなどの環境でもいいです。
ヒントください
2021/04/03(土) 17:42:25.44ID:5dv7xI+Y
1ドットずつ走査して近似色以外は透明色で塗りつぶせば
2021/04/03(土) 17:43:36.15ID:Hj8nCIUt
>>88
こういう話? C++ は関係なさそう。
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AD%E3%83%8E%E3%82%A4%E5%9B%B3
gimp のプラグインになってるんならソースありそうだからそれ見ればいいんじゃねとも思う。
こういう話? C++ は関係なさそう。
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AD%E3%83%8E%E3%82%A4%E5%9B%B3
gimp のプラグインになってるんならソースありそうだからそれ見ればいいんじゃねとも思う。
2021/04/03(土) 18:06:49.53ID:XWE78oAN
OpenGLとかグラフィックプログラミング系のスレで聞くべき・・といいたいところだが
この板は上から下まで、やれこっちが優れてるだのこのやりかたは汚いだの
アホみたいなマナー・作法論しか議論していない板なのでたぶん書籍かWebを検索したほうがいい
この板は上から下まで、やれこっちが優れてるだのこのやりかたは汚いだの
アホみたいなマナー・作法論しか議論していない板なのでたぶん書籍かWebを検索したほうがいい
2021/04/03(土) 18:11:14.04ID:FsaMqi3u
適当に点{ p1, p2, p3, ... } をばらまいてボロノイ境界を描いたら
ボロノイ境界が勝手に種々の多角形になりまくり……!
あとは1つの区画内を点{ p1, p2, p3, ... }における画像の色とかの
適当な色で塗り潰せば良い
言うは安し……!!
ボロノイ境界が勝手に種々の多角形になりまくり……!
あとは1つの区画内を点{ p1, p2, p3, ... }における画像の色とかの
適当な色で塗り潰せば良い
言うは安し……!!
2021/04/03(土) 22:25:01.27ID:M/dPb3y2
とりあえず2Dゲーをいちいちポリゴンでやるのはやめといた方がいいかも・・
テクスチャの内容を一枚のビットマップとしていじった方が楽な気がする
スワイプやドラッグでピースを動かすときは板ポリ使ってもいいかもしれんけど
テクスチャの内容を一枚のビットマップとしていじった方が楽な気がする
スワイプやドラッグでピースを動かすときは板ポリ使ってもいいかもしれんけど
94デフォルトの名無しさん
2021/04/04(日) 10:32:13.85ID:b5JcZ1t595デフォルトの名無しさん
2021/04/04(日) 10:37:45.94ID:b5JcZ1t5 >>93
ビットマップでやるってのは、マスでなんとかするってことですか?
ビットマップでやるってのは、マスでなんとかするってことですか?
2021/04/04(日) 10:58:31.72ID:xtAOreBW
領域を分割する頂点と辺を決めたらあとは各ピクセルごとにどの領域に含まれるかを判断すればいいように思うが
2021/04/04(日) 13:16:57.18ID:Qg2Ccl1w
>>88のサンプル画像からすると、分割された領域の頂点は格子点上にないといけないっぽい
ボロノイ境界の交点は都合良く格子点上に来るとは限らないから、ボロノイ「領域」
の作図式にやるのはいろいろな点でイマイチ感が、
ボロノイ境界の交点は都合良く格子点上に来るとは限らないから、ボロノイ「領域」
の作図式にやるのはいろいろな点でイマイチ感が、
2021/04/04(日) 13:46:45.93ID:Qg2Ccl1w
ちゅか要件定義的に(三角形は良いとして)
(1) 四角形や五角形への分割において凹図形を許容するのか否か
(2) ある図形の1つの辺を2つ以上の隣接図形で共有することを許容するのか否か
とか決めねばならない
いや決めたからといって別に頂点決定アルゴリズムの妙案とか無いが_○/|_
(1) 四角形や五角形への分割において凹図形を許容するのか否か
(2) ある図形の1つの辺を2つ以上の隣接図形で共有することを許容するのか否か
とか決めねばならない
いや決めたからといって別に頂点決定アルゴリズムの妙案とか無いが_○/|_
99デフォルトの名無しさん
2021/04/04(日) 18:57:03.43ID:b5JcZ1t5 ここは飛ばしてゲーム作ります(´・ω・`)、、、別に面白さと関係ないしね、、、。
100デフォルトの名無しさん
2021/04/04(日) 19:04:13.20ID:b5JcZ1t5 processingで似たような事できますか?ちょこちょこ練習しようかな
ゲームエンジン使うほどでもないので
https://processing.org/download/support.html
これダウンロードできます?寄付しろと言われるんですけども
ゲームエンジン使うほどでもないので
https://processing.org/download/support.html
これダウンロードできます?寄付しろと言われるんですけども
101デフォルトの名無しさん
2021/04/04(日) 19:10:44.91ID:b5JcZ1t5 できた すみあmせん
102デフォルトの名無しさん
2021/04/05(月) 08:59:16.68ID:8ugS0e8D c++言語をググるとビャーネも必ず出てきて
彼が設計者だとのことですが、コンパイラを作ってるのは彼ではないですよね
具体的に彼は何をしたの?
彼が設計者だとのことですが、コンパイラを作ってるのは彼ではないですよね
具体的に彼は何をしたの?
103デフォルトの名無しさん
2021/04/05(月) 09:24:06.09ID:YIdyLrea 言語仕様の策定だろ
まあ最初のコンパイラー(コンバーターかも)ぐらいは作ってるとは思うけど
まあ最初のコンパイラー(コンバーターかも)ぐらいは作ってるとは思うけど
104デフォルトの名無しさん
2021/04/05(月) 09:27:14.80ID:cScuzdm0 当初はCのプリプロセッサだから今で言うとTypescriptみたいなものだな
105デフォルトの名無しさん
2021/04/05(月) 11:51:16.82ID:zIvWtxBS C++標準化委員会は誰が組織したんや?
106デフォルトの名無しさん
2021/04/05(月) 11:53:41.43ID:zIvWtxBS それとも国際標準化機構(ISO)か何かの配下なの?
107デフォルトの名無しさん
2021/04/05(月) 12:36:06.42ID:ESZTLEZZ108デフォルトの名無しさん
2021/04/05(月) 17:28:39.12ID:2Tvboykg そして世界は闇と混沌に包まれた……
109デフォルトの名無しさん
2021/04/05(月) 19:55:46.69ID:rNcivJgw c++はクソだが、プログラマが求めたクソなのだ。
110デフォルトの名無しさん
2021/04/05(月) 22:13:27.34ID:zIvWtxBS111デフォルトの名無しさん
2021/04/05(月) 22:24:25.87ID:vDuR7coO ビヨーン先生の功績は
ハゲても立派なプログラマになれるという勇気をくれたことだろう
ハゲても立派なプログラマになれるという勇気をくれたことだろう
112デフォルトの名無しさん
2021/04/06(火) 06:59:06.97ID:rUOwZVXJ 質問ですが
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でやるには良いですのん?
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でやるには良いですのん?
113デフォルトの名無しさん
2021/04/06(火) 06:59:22.44ID:rUOwZVXJ arrがソートされていれば
auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
std::lower_bound(arr.begin(), arr.end(), cmpFunc2);
で済む話なんだども、SomeBigObjectはコピーの手間がかかるので直接std::sortしたくないという、
auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
std::lower_bound(arr.begin(), arr.end(), cmpFunc2);
で済む話なんだども、SomeBigObjectはコピーの手間がかかるので直接std::sortしたくないという、
114デフォルトの名無しさん
2021/04/06(火) 07:00:25.45ID:rUOwZVXJ また手動で組めということなら明らかに組める
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はこういうケースのためにあり、論理的に実現できる以上やり方が考えられていないとおかしいはず……
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はこういうケースのためにあり、論理的に実現できる以上やり方が考えられていないとおかしいはず……
115デフォルトの名無しさん
2021/04/06(火) 07:42:07.19ID:w+lldWjr auto cmpFunc3 = [](int a, int b)->bool{ return (arr[a] < arr[b]); }
i = std::lower_bound(indices.begin(), indices.end(), cmpFunc3);
arr[i];
じゃいかんのかしら
i = std::lower_bound(indices.begin(), indices.end(), cmpFunc3);
arr[i];
じゃいかんのかしら
116デフォルトの名無しさん
2021/04/06(火) 15:08:28.23ID:rUOwZVXJ >>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_
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_
117デフォルトの名無しさん
2021/04/06(火) 17:08:29.35ID:mAZMW+WU 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];
じゃあこれで
auto i = std::lower_bound(indices.begin(), indices.end(), x, cmpFunc3);
arr[*i];
じゃあこれで
118デフォルトの名無しさん
2021/04/06(火) 18:31:21.10ID:rUOwZVXJ >>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);
}
動作するサンプル例:
https://ideone.com/xbSHmi
ムリス、
つか次のように死ぬほど腐った書き方をしたらとりあえずできるた、
/// 間接ソート版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);
}
動作するサンプル例:
https://ideone.com/xbSHmi
119デフォルトの名無しさん
2021/04/07(水) 00:39:13.23ID:C05ugDVV const int lb = std::distance(indices.begin(),std::partition_point(indices.begin(), indices.end(), [&x,&arr](const int i){ return arr[i] < x; }));
これでどうかな?
これでどうかな?
120デフォルトの名無しさん
2021/04/07(水) 01:13:46.41ID:B+YGKOyD >>115
エピさんかしらん
エピさんかしらん
121デフォルトの名無しさん
2021/04/07(水) 01:17:07.25ID:KcAzRCeR122デフォルトの名無しさん
2021/04/07(水) 05:42:50.50ID:FlnHFJBF123デフォルトの名無しさん
2021/04/07(水) 06:26:08.77ID:hpqJGpH8 >>122
動かないのをおま環言うのはよく聞くがその逆を聞いたのはこれが初めてかも
動かないのをおま環言うのはよく聞くがその逆を聞いたのはこれが初めてかも
124デフォルトの名無しさん
2021/04/07(水) 07:24:58.99ID:FlnHFJBF 確かに動いているように見えるが(呼び出し回数も2分探索相当に見えるが)
Compにそんな引数渡して委員会?!
錯覚じゃないの;;;
Compにそんな引数渡して委員会?!
錯覚じゃないの;;;
125デフォルトの名無しさん
2021/04/07(水) 08:00:02.53ID:FlnHFJBF std::lower_bound(first last, value, comp);
という呼び出しにおいて、compはcomp((firstやlastと同じ型のiteratorが指す要素), value)
という呼び出され方しかされないこと、および
valueの型はfirstやlastが指す要素の型とま無関係に好きな型にして良いと規格で決まっている?!
という呼び出しにおいて、compはcomp((firstやlastと同じ型のiteratorが指す要素), value)
という呼び出され方しかされないこと、および
valueの型はfirstやlastが指す要素の型とま無関係に好きな型にして良いと規格で決まっている?!
126デフォルトの名無しさん
2021/04/07(水) 09:20:20.01ID:F9L3hm15 チラッと規格見た限り
value は first、last と無関係でいいし
comp の第一引数はfirst、lastのiteratorが指す型で、第二引数はvalueの型に決まっているように見える
value は first、last と無関係でいいし
comp の第一引数はfirst、lastのiteratorが指す型で、第二引数はvalueの型に決まっているように見える
127デフォルトの名無しさん
2021/04/07(水) 12:44:59.78ID:94shRdbf >>51じゃないが、オブジェクト指向で設計する意味が分からなくなった
汎用性の高いフリー関数が沢山あればそれで良いじゃん
汎用性の高いフリー関数が沢山あればそれで良いじゃん
128デフォルトの名無しさん
2021/04/07(水) 15:37:37.40ID:2guWvkPP129デフォルトの名無しさん
2021/04/07(水) 15:42:26.98ID:2guWvkPP ・・・いや、 lower_bound() 限定なら引数の順番もその想定でいいのか。
upper_bound() だと comp(value, x) になったりするから、交換可能にしとくのがいいけど、
片方だけ使うなら交換可能にする必要はない、と。
upper_bound() だと comp(value, x) になったりするから、交換可能にしとくのがいいけど、
片方だけ使うなら交換可能にする必要はない、と。
130デフォルトの名無しさん
2021/04/07(水) 15:44:08.41ID:2guWvkPP131デフォルトの名無しさん
2021/04/07(水) 15:45:24.56ID:x8RK+cZQ >>128
requiresのとこは見た?
requiresのとこは見た?
132デフォルトの名無しさん
2021/04/07(水) 17:04:44.94ID:x8RK+cZQ133デフォルトの名無しさん
2021/04/08(木) 06:24:25.70ID:ByNsu0yr134デフォルトの名無しさん
2021/04/08(木) 10:00:06.97ID:b/WIqkut >>132
あ、ごめん。比較関数の引数順を交換可能にするのは lower_bound, upper_bound 両用にすることを想定しての話。
あ、ごめん。比較関数の引数順を交換可能にするのは lower_bound, upper_bound 両用にすることを想定しての話。
135デフォルトの名無しさん
2021/04/08(木) 16:09:17.02ID:uZSkMyuO 生魚にあたって、
入院した病院の天井みながらSTL考えてたもんな
入院した病院の天井みながらSTL考えてたもんな
136デフォルトの名無しさん
2021/04/08(木) 16:25:55.36ID:/Z+9yHN3 ステパノフ?
137デフォルトの名無しさん
2021/04/08(木) 23:02:01.67ID:6aXKgzGP ニダーランが終了になるそうだ
もう糞スレは立てにくくなるな
ざまあ
もう糞スレは立てにくくなるな
ざまあ
138デフォルトの名無しさん
2021/04/09(金) 01:15:08.43ID:iqXbiQSS139デフォルトの名無しさん
2021/04/09(金) 11:44:34.26ID:B1MFSAev 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)
}
仮に、もし(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)
}
140デフォルトの名無しさん
2021/04/09(金) 11:45:42.89ID:B1MFSAev >>139
誤:仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
正:(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
誤:仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
正:(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
141デフォルトの名無しさん
2021/04/09(金) 11:58:14.49ID:O38yN+C3 >>138
C++03にもstd::binary_searchあるぞ
C++03にもstd::binary_searchあるぞ
142はちみつ餃子 ◆8X2XSCHEME
2021/04/09(金) 12:00:21.75ID:foJJo5gI >>139
> nullptr的なものが代入されるんでしょうか。
この場合はされる。
ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
> いったいどの行のどの演算子(またはどの部分)で
> カウントアップ/カウントダウンされるんでしょうか。
= がその役割を持っている。
ムーブコンストラクタとムーブ代入演算子によってカウントされる。
> nullptr的なものが代入されるんでしょうか。
この場合はされる。
ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
> いったいどの行のどの演算子(またはどの部分)で
> カウントアップ/カウントダウンされるんでしょうか。
= がその役割を持っている。
ムーブコンストラクタとムーブ代入演算子によってカウントされる。
143デフォルトの名無しさん
2021/04/09(金) 12:02:12.29ID:B1MFSAev >>140
どうやら、
(1) の中央の = では、TからTへの move-constructorが呼び出され、
(2)や(3) の中央の = では、TからTへの move-assignment operatorが呼び出される、
ということのようですが、
Tのmove-contructorやmove-assingment operatorは、ユーザーの実装次第で、
ユーザーがそれらを明示的に書かなかった場合の「デフォルトの定義」は
現在もまだ論争中で、標準的な仕様が決まってない、ということらしいですね。
間違っていれば指摘してください。
どうやら、
(1) の中央の = では、TからTへの move-constructorが呼び出され、
(2)や(3) の中央の = では、TからTへの move-assignment operatorが呼び出される、
ということのようですが、
Tのmove-contructorやmove-assingment operatorは、ユーザーの実装次第で、
ユーザーがそれらを明示的に書かなかった場合の「デフォルトの定義」は
現在もまだ論争中で、標準的な仕様が決まってない、ということらしいですね。
間違っていれば指摘してください。
144デフォルトの名無しさん
2021/04/09(金) 12:11:46.34ID:fGHst4+7145デフォルトの名無しさん
2021/04/09(金) 12:20:57.67ID:QYkH8yRN >>143
以下のサイトによれば、「標準的な仕様は決まっている」ようです:
drafet C++11 standareのsection 12.8のparagraph 15に
implicitly-defined copy/move constructor は、
「a memberwise copy/move of its bases and members」
であると書いてあるそうですから:
https://stackoverflow.com/questions/18290523/is-a-default-move-constructor-equivalent-to-a-member-wise-move-constructor
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).
以下のサイトによれば、「標準的な仕様は決まっている」ようです:
drafet C++11 standareのsection 12.8のparagraph 15に
implicitly-defined copy/move constructor は、
「a memberwise copy/move of its bases and members」
であると書いてあるそうですから:
https://stackoverflow.com/questions/18290523/is-a-default-move-constructor-equivalent-to-a-member-wise-move-constructor
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).
146デフォルトの名無しさん
2021/04/09(金) 12:39:59.46ID:QYkH8yRN >>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相当の
状態にしてしまう。
ということのようですね。
>ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
>標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
>メンバ関数 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相当の
状態にしてしまう。
ということのようですね。
147デフォルトの名無しさん
2021/04/09(金) 12:42:08.46ID:QYkH8yRN >>146
逆に言えば、Tのメンバに、A *pA; のような生ポインタがあると、
Tの暗黙のmoveコンストラクタ/move代入演算子では、恐らく、
「src側(from側)」にはnullptrが代入されない(??)ので、非常に困った
問題を招くかも知れないと?
逆に言えば、Tのメンバに、A *pA; のような生ポインタがあると、
Tの暗黙のmoveコンストラクタ/move代入演算子では、恐らく、
「src側(from側)」にはnullptrが代入されない(??)ので、非常に困った
問題を招くかも知れないと?
148デフォルトの名無しさん
2021/04/09(金) 12:44:10.41ID:QYkH8yRN149デフォルトの名無しさん
2021/04/09(金) 12:45:44.21ID:iOouO9yu 生ポ入りクラスに暗黙move関数定義できたっけ?
150デフォルトの名無しさん
2021/04/09(金) 18:46:49.83ID:WYvZUx+H c++についてうんちく垂れるやつに限って仕事ができない
そんなうんちくどうでもいいから、さっさと作れよって思われてる先輩いるわ
そんなうんちくどうでもいいから、さっさと作れよって思われてる先輩いるわ
151デフォルトの名無しさん
2021/04/09(金) 19:06:14.56ID:PF0aPDJN >>150
プログラマは怠惰であれ、を地で行ってるんだろう
プログラマは怠惰であれ、を地で行ってるんだろう
152デフォルトの名無しさん
2021/04/09(金) 19:55:10.43ID:O38yN+C3 >>144
> わざわざ誰が書いたかわからないようなものより自作できるなら自作するだろ
おまえは一生二度とライブラリもOSも使うな
ベアメタルだけで食っていけ
それができたら、おまえに付いてくる者たちが顕れるだろう
できなければ人知れず消えるだけだ
どうなりたいかは、お前の人生だ
俺がどうしろとは言えない
> わざわざ誰が書いたかわからないようなものより自作できるなら自作するだろ
おまえは一生二度とライブラリもOSも使うな
ベアメタルだけで食っていけ
それができたら、おまえに付いてくる者たちが顕れるだろう
できなければ人知れず消えるだけだ
どうなりたいかは、お前の人生だ
俺がどうしろとは言えない
153デフォルトの名無しさん
2021/04/09(金) 20:38:18.09ID:8YMfBGcF >>150
またお前か。さっさとプログラミング覚えろよ
またお前か。さっさとプログラミング覚えろよ
154デフォルトの名無しさん
2021/04/09(金) 23:03:48.36ID:mQjFjskh std::binary_search()は戻り値とかなんとboolや
こんなのよかちゃんと位置を返してくれるstd::lower_bound()の方がよっぽど使いでがある
ちなstd::lower_bound()が2分探索か線形探索かは使うイテレータの条件次第
こんなのよかちゃんと位置を返してくれるstd::lower_bound()の方がよっぽど使いでがある
ちなstd::lower_bound()が2分探索か線形探索かは使うイテレータの条件次第
155デフォルトの名無しさん
2021/04/09(金) 23:08:01.53ID:mQjFjskh std::lower_bound()が線形探索だと断言してくださる香ばしいblogも世の中にはあるが
https://rsk0315.hatenablog.com/entry/2019/09/10/173708
これがまつがいであることは比較関数の中でprintf()でもしたらたちどころにワカル
https://rsk0315.hatenablog.com/entry/2019/09/10/173708
これがまつがいであることは比較関数の中でprintf()でもしたらたちどころにワカル
156デフォルトの名無しさん
2021/04/09(金) 23:29:26.43ID:mQjFjskh ゴメソリンク先は必ずしも断言はしていなくって、std::set<T>にstd::lower_bound()を適用する例か、
これのイテレータはrandom-access iteratorでないから確かに線形探索になる
これのイテレータはrandom-access iteratorでないから確かに線形探索になる
157デフォルトの名無しさん
2021/04/10(土) 02:28:09.12ID:+Yr/nSyJ158デフォルトの名無しさん
2021/04/10(土) 13:02:03.74ID:62UJIlpX159デフォルトの名無しさん
2021/04/10(土) 13:04:24.60ID:ziRUnSTY160デフォルトの名無しさん
2021/04/11(日) 21:20:47.36ID:aRgjPq06 コンパイラはともかくリンカに計算負担をかけるのはバカな設計だなと思うわ。
161デフォルトの名無しさん
2021/04/11(日) 21:31:53.64ID:X3ahc6YE >>160 何の設計の話?
162デフォルトの名無しさん
2021/04/11(日) 22:03:18.21ID:oDlLzjRc 暗黙のmoveがnullptr代入してくれないとか生ポあるクラスに暗黙のctor定義してくれるのか、とか
学ぶ順番間違えて勘違いしてるやつ上の方にいるけど
そもそも生ポの扱いに言語が介入するんならdtorでdeleteしてくれるのか、とか考えつかないのかね・・
学ぶ順番間違えて勘違いしてるやつ上の方にいるけど
そもそも生ポの扱いに言語が介入するんならdtorでdeleteしてくれるのか、とか考えつかないのかね・・
163デフォルトの名無しさん
2021/04/11(日) 22:28:21.28ID:AbYQFAoI 質問者はポインタ型とshared_ptrについて聞いてたのに、shared_ptrのことしか答えなかった餃子が悪い。
謝れ!俺に
謝れ!俺に
164デフォルトの名無しさん
2021/04/12(月) 13:47:17.66ID:SAslKmLH 指定ソフトのFWを許可するAPI教えてくださいよ
165はちみつ餃子 ◆8X2XSCHEME
2021/04/12(月) 15:59:50.47ID:8pnQviW4 そうか。
166デフォルトの名無しさん
2021/04/12(月) 18:14:36.03ID:jbHGiSQO 皆さま御機嫌よう、ちょっと質問させてください
class hogeの内部でenum class fugaを定義し、
そのfugaをclass hogehoge でメンバ変数として使用したいのですが、
hogehoge のヘッダーにはなるべくhoge をインクルードさせたくありません。
もちろんfuga変数はヘッダーに置いて使用したいのですが……
前方宣言でfugaを宣言してもhoge::fugaと互換?が無いため代入が出来ません。
キャストで戻したりして使っているのですがこれならintでもいいかなと……
クラス内クラスの前方宣言は難しいのでしょうか?
何か方法がありましたら教えていただきたく……
class hoge{
enum class fuga{
one,two,three,SUM
};
};
//ヘッダーはソースにインクルードしたい
class hogehoge{
hoge::fuga mfuga;
};
こんかかんじで使いたいのですがエラーになってしまいsまずorz
class hogeの内部でenum class fugaを定義し、
そのfugaをclass hogehoge でメンバ変数として使用したいのですが、
hogehoge のヘッダーにはなるべくhoge をインクルードさせたくありません。
もちろんfuga変数はヘッダーに置いて使用したいのですが……
前方宣言でfugaを宣言してもhoge::fugaと互換?が無いため代入が出来ません。
キャストで戻したりして使っているのですがこれならintでもいいかなと……
クラス内クラスの前方宣言は難しいのでしょうか?
何か方法がありましたら教えていただきたく……
class hoge{
enum class fuga{
one,two,three,SUM
};
};
//ヘッダーはソースにインクルードしたい
class hogehoge{
hoge::fuga mfuga;
};
こんかかんじで使いたいのですがエラーになってしまいsまずorz
167デフォルトの名無しさん
2021/04/12(月) 18:58:57.80ID:jbHGiSQO enum classはグローバルに置いた方がいいんでしょうか?
任意のクラス内部で規定したいenumが見た目も便利だと思ったのでなるべく入れ子にしたかったのですが
任意のクラス内部で規定したいenumが見た目も便利だと思ったのでなるべく入れ子にしたかったのですが
168デフォルトの名無しさん
2021/04/12(月) 19:30:43.48ID:e7ZnlCa0 >>167
hoge をインクルードしないところで hoge::fuga を使いたいということは
fuga は hoge にそれほど強く結びついていないということで、外に出すのが妥当なのでは?
外に置いたうえで hoge 内で using fuga = outer_fuga とでもすれば、見た目は損なわれないだろうし。
hoge をインクルードしないところで hoge::fuga を使いたいということは
fuga は hoge にそれほど強く結びついていないということで、外に出すのが妥当なのでは?
外に置いたうえで hoge 内で using fuga = outer_fuga とでもすれば、見た目は損なわれないだろうし。
169デフォルトの名無しさん
2021/04/12(月) 19:43:07.58ID:jbHGiSQO170デフォルトの名無しさん
2021/04/12(月) 19:43:19.37ID:jbHGiSQO ありがとうございました
171デフォルトの名無しさん
2021/04/13(火) 19:17:47.93ID:CekyfU50 std::sortがセーフソートかどうかって決まってないんですね?
172デフォルトの名無しさん
2021/04/13(火) 19:20:46.00ID:dUpGrFVX セーフソートとは何なのか、決まってないですね。
173デフォルトの名無しさん
2021/04/13(火) 19:49:36.98ID:3ATJKALM 安定ソートのことならstd::stable_sortを使え
174デフォルトの名無しさん
2021/04/13(火) 20:39:25.63ID:E/HY6RLS std::stable_sort<T>はどうしてもstd::sort<T>より遅い
からstd::stable_sort<T>で安定ソートするテクニックが存在するし需要がある
からstd::stable_sort<T>で安定ソートするテクニックが存在するし需要がある
175デフォルトの名無しさん
2021/04/13(火) 20:57:29.81ID:E/HY6RLS もちろんタダでというわけにはいかずn個のTのソーティングに対しn個の整数型の配列が別途必要だがとにかくできる
176デフォルトの名無しさん
2021/04/13(火) 20:58:57.72ID:E/HY6RLS まつがえたorz
誤: std::stable_sort<T>
正: std::sort<T>
誤: std::stable_sort<T>
正: std::sort<T>
177デフォルトの名無しさん
2021/04/13(火) 21:07:31.95ID:E/HY6RLS 計算量の仕様からすると何だかんだ言って
std::stable_sort<T>の中身はマージソートで、
std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
ぐらいしかありえない
std::stable_sort<T>の中身はマージソートで、
std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
ぐらいしかありえない
178デフォルトの名無しさん
2021/04/13(火) 21:10:52.16ID:CekyfU50 みなさんありがとうございます
安定ソートのことでした
安定ソートのことでした
179デフォルトの名無しさん
2021/04/14(水) 05:40:12.90ID:OwJGUJdo > std::stable_sort<T>の中身はマージソートで、
これはまあそんなもうだろうけど
> std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
なんでここまで限定するんだ?
これはまあそんなもうだろうけど
> std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
なんでここまで限定するんだ?
180デフォルトの名無しさん
2021/04/14(水) 06:51:50.47ID:1+2DD+HN https://cpprefjp.github.io/reference/algorithm/sort.html
>C++11以降: O(N log N) (N == last - first) 計算量での比較
>クイックソートは平均計算量がO(N Log N)だが、最悪計算量がO(n^2)である。そのため、C++03の計算量要件には合致するが、C++11の要件には合致しない
>C++11以降: O(N log N) (N == last - first) 計算量での比較
>クイックソートは平均計算量がO(N Log N)だが、最悪計算量がO(n^2)である。そのため、C++03の計算量要件には合致するが、C++11の要件には合致しない
181デフォルトの名無しさん
2021/04/14(水) 06:52:54.28ID:mDTOVFC3 ubuntuでの開発環境って何があるんでしょうか?
openglなのでc++を使うことになると思うんですが、c++はideとしてvscodeでいいですよね
guiは何が一般的なんでしょうか?
openglなのでc++を使うことになると思うんですが、c++はideとしてvscodeでいいですよね
guiは何が一般的なんでしょうか?
182デフォルトの名無しさん
2021/04/14(水) 07:20:31.68ID:OwJGUJdo > この関数には、特定のアルゴリズムで実装すべきという規定はない
■ このスレッドは過去ログ倉庫に格納されています
