C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part150
https://mevius.5ch.net/test/read.cgi/tech/1584975873/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
テンプレここまで
C++相談室 part151
■ このスレッドは過去ログ倉庫に格納されています
2020/05/14(木) 11:53:25.59ID:ZPCfyTux
42デフォルトの名無しさん
2020/05/16(土) 17:16:42.14ID:uXmamJPc 普通に考えたらこれだろ。
std::make_pair( n, 100 )
std::make_pair( n, 100 )
43デフォルトの名無しさん
2020/05/16(土) 17:36:40.03ID:nLCzlpLv 皆さん。情報ありがとうございます。
>>38
試してみた所ビットを33個立てるとstd::overflow が出てしまうようです。
おそらく関数の仕様的な問題だと思うのですが……
>>40
a.insert( std::make_pair<std::bitset<MAX>, int>( n, 100 ) );
とやってみた所エラーが出てしまいました。
この辺の指定はコンパイラが勝手に行ってくれると思っていたのですが、
指定しなければならないのでしょうか?
>>41
std::unordered_map を利用するとうまくいきました。
ありがとうございます。
>>42
すみません。
>>40と同じ理由なのでしょうか?
>>38
試してみた所ビットを33個立てるとstd::overflow が出てしまうようです。
おそらく関数の仕様的な問題だと思うのですが……
>>40
a.insert( std::make_pair<std::bitset<MAX>, int>( n, 100 ) );
とやってみた所エラーが出てしまいました。
この辺の指定はコンパイラが勝手に行ってくれると思っていたのですが、
指定しなければならないのでしょうか?
>>41
std::unordered_map を利用するとうまくいきました。
ありがとうございます。
>>42
すみません。
>>40と同じ理由なのでしょうか?
2020/05/16(土) 17:50:14.76ID:qkv5Lv3o
bitset の値同士で < での比較ができないから map でエラーってことか。
unordered_map なら == で比較できれば使える、と。
unordered_map なら == で比較できれば使える、と。
2020/05/16(土) 18:00:40.13ID:tFvEvqcA
46デフォルトの名無しさん
2020/05/17(日) 14:06:29.05ID:7W3ntFmq ラムダ式にテンプレートの型指定ってできないんですかね?
auto f = []<class T>(T) {};
auto f2 = []<class T>() {};
f(1);
f2<int>();
fは引数にその型のパラメータがあるので大丈夫なんですけど、
f2だとコンパイルが通らないです...
auto f = []<class T>(T) {};
auto f2 = []<class T>() {};
f(1);
f2<int>();
fは引数にその型のパラメータがあるので大丈夫なんですけど、
f2だとコンパイルが通らないです...
2020/05/17(日) 14:12:23.12ID:ykqeUojC
ダミーの引数渡して
decltypeするとかすればいいんじゃね
decltypeするとかすればいいんじゃね
2020/05/17(日) 14:33:24.46ID:AX8hrxuQ
>>46
呼び出してるのはあくまでオーバーロードされた関数呼び出し演算子なので、こうする
f2.operator()<int>();
https://wandbox.org/permlink/uVSptZMZErNrL5p3
呼び出してるのはあくまでオーバーロードされた関数呼び出し演算子なので、こうする
f2.operator()<int>();
https://wandbox.org/permlink/uVSptZMZErNrL5p3
2020/05/17(日) 14:41:04.25ID:7W3ntFmq
>>48
なるほど!ありがとうございます!!
なるほど!ありがとうございます!!
50デフォルトの名無しさん
2020/05/18(月) 09:15:27.74ID:XEI7YtdQ なるほど
戻り値で判断するのも知りたい
戻り値で判断するのも知りたい
2020/05/18(月) 10:30:31.10ID:VVfIWrZc
>>46
auto仮引数ではあかんの?
auto f = [](auto arg) { cout << typeid(arg).name() << endl; };
f(1); //int
f(1.5); //double
auto仮引数ではあかんの?
auto f = [](auto arg) { cout << typeid(arg).name() << endl; };
f(1); //int
f(1.5); //double
52デフォルトの名無しさん
2020/05/18(月) 19:43:09.64ID:NOr8CY4q 以下のコードを実行すると 'あ' がアルファベットと判定されてしまうのですが、なぜかわかりますか?
Visual C++ 2019でもg++ 7.5.0でも結果は一緒でした(値は違いますが)。
std::locale loc("");
std::locale::global(loc);
std::wcout << std::isalpha(L'あ') << std::endl;
std::wcout << iswalpha(L'あ') << std::endl;
Visual C++ 2019でもg++ 7.5.0でも結果は一緒でした(値は違いますが)。
std::locale loc("");
std::locale::global(loc);
std::wcout << std::isalpha(L'あ') << std::endl;
std::wcout << iswalpha(L'あ') << std::endl;
2020/05/18(月) 20:28:29.14ID:SqFV2JvV
あはアルファベットだからだろう
2020/05/18(月) 20:49:09.32ID:vxC60pVH
というより、その判定結果だからこそあはアルファベットなんだよ
isalphaがtrueを返すものを現在のロケールにおけるアルファベットと呼ぶと言う方が正しいか
isalphaがtrueを返すものを現在のロケールにおけるアルファベットと呼ぶと言う方が正しいか
2020/05/18(月) 20:53:28.77ID:ah40zw28
いや、isalphaがtrueになる文字は各localeで決まっている
isalphaはそれを垂れ流しているだけ
isalphaはそれを垂れ流しているだけ
56デフォルトの名無しさん
2020/05/18(月) 21:32:06.39ID:cgM2dsGJ is_ascii_alpha()のほうが良く使う。
57デフォルトの名無しさん
2020/05/18(月) 22:16:41.22ID:NOr8CY4q ありがとうございます
普段は「日本語のアルファベット」とはあまり使わないけれど、
設定されている言語で表現するための文字のことをアルファベットと呼んでいると理解しておきます。
普段は「日本語のアルファベット」とはあまり使わないけれど、
設定されている言語で表現するための文字のことをアルファベットと呼んでいると理解しておきます。
2020/05/19(火) 03:42:01.59ID:dHzzm0xI
そもそも英語では普通にひらがなとカタカナを指して"Japanese alphabet"と呼ぶ
59デフォルトの名無しさん
2020/05/19(火) 10:55:08.90ID:h69Ba80R アルファベットはアラビア語が語源?
60デフォルトの名無しさん
2020/05/19(火) 10:56:23.71ID:h69Ba80R あと正確に言うなら日本語のアルファベットは
いろは
いろは
2020/05/19(火) 12:21:31.91ID:kOq4o5Tk
アルファベット=表音文字と言いたいの?
2020/05/19(火) 13:16:28.27ID:kUNy0nAn
stlを考えた人は馬鹿だからな。
2020/05/19(火) 13:40:15.28ID:kUNy0nAn
isalpha()が2バイト文字環境でいままで使われてきた経緯も知らずに勝手に仕様を変えてしまう馬鹿な人々。
min,maxも伝統的なマクロの存在を知らずに衝突させてしまう馬鹿。
さらに馬鹿なのはSTL作者達なのにコンパイラ処理系作者のせいにしてしまう愚かな烏合の衆たち。
min,maxも伝統的なマクロの存在を知らずに衝突させてしまう馬鹿。
さらに馬鹿なのはSTL作者達なのにコンパイラ処理系作者のせいにしてしまう愚かな烏合の衆たち。
2020/05/19(火) 13:44:38.41ID:JQlWutmQ
isalphaは昔のcでもlocale依存だろ
65デフォルトの名無しさん
2020/05/19(火) 14:25:44.49ID:O4jzhFRD STLは、なぜあの時代に、ここまで抽象化できたのか?彼らは宇宙から来たのではないか?などと考えてしまうが。
66デフォルトの名無しさん
2020/05/19(火) 14:27:12.72ID:O4jzhFRD Windows.hのmin、maxは困りものだよな。
2020/05/19(火) 14:51:53.51ID:oq2DQSv9
マクロでminmax書いているほうがどう考えてもバカだよな
2020/05/19(火) 14:54:10.83ID:oq2DQSv9
win32の設計とかあーバカコードだなコレってのがちらほら
2020/05/19(火) 16:31:48.66ID:kOq4o5Tk
>>67
御意
御意
2020/05/19(火) 17:47:23.01ID:HCP/tGTo
人類がBOOST_PREVENT_MACRO_SUBSTITUTIONから解放される日は遠い
2020/05/19(火) 18:01:48.72ID:0UAmioLe
STLの方が馬鹿。
今までのものを知らないで独自のものを書くのは簡単。
勉強もせずに独自の日記を書くようなことだから。
今までのものを知らないで独自のものを書くのは簡単。
勉強もせずに独自の日記を書くようなことだから。
72デフォルトの名無しさん
2020/05/19(火) 18:23:54.92ID:8HY/3oGP なぜ会社を100社以上バックレたのか?働きたくない男の末路!
https://www.youtube.com/watch?v=C73If3B6MXc
【遅刻早退ドタキャン癖】の絶望的な解説。社会人失格の烙印。
https://www.youtube.com/watch?v=bGarZKcC08s
【悲報】あがり症は完治しない!緊張対策よりも開き直り!
https://www.youtube.com/watch?v=-jMUFZc9vRA
結婚式への参加は『社会の底辺』には地獄!非モテ手当を寄こせ!
https://www.youtube.com/watch?v=oKFrGkpsP8Y
親戚の『葬式』ドタキャンで激怒された!冠婚葬祭パワハラが酷い!
https://www.youtube.com/watch?v=0L-EAndCodE
リボ払い借金500万円の一日!敗者復活ルーティーン
https://www.youtube.com/watch?v=shJMgp6EuW8
https://www.youtube.com/watch?v=C73If3B6MXc
【遅刻早退ドタキャン癖】の絶望的な解説。社会人失格の烙印。
https://www.youtube.com/watch?v=bGarZKcC08s
【悲報】あがり症は完治しない!緊張対策よりも開き直り!
https://www.youtube.com/watch?v=-jMUFZc9vRA
結婚式への参加は『社会の底辺』には地獄!非モテ手当を寄こせ!
https://www.youtube.com/watch?v=oKFrGkpsP8Y
親戚の『葬式』ドタキャンで激怒された!冠婚葬祭パワハラが酷い!
https://www.youtube.com/watch?v=0L-EAndCodE
リボ払い借金500万円の一日!敗者復活ルーティーン
https://www.youtube.com/watch?v=shJMgp6EuW8
2020/05/19(火) 19:02:02.51ID:VP2fOBMJ
>>72
スレチ グロ
スレチ グロ
2020/05/20(水) 06:07:41.13ID:8m9cjgNh
関数(始点,終点)に馴染めないバカのあぶり出しだったな
関数(始点,個数)に固執してたやつらがSTLで吠え面かかされたw
関数(始点,個数)に固執してたやつらがSTLで吠え面かかされたw
2020/05/20(水) 14:27:55.42ID:9xAqQrOe
2020/05/20(水) 14:30:18.93ID:9xAqQrOe
https://ideone.com/Gq2X2N
無しだとちゃんと出るっぽいです。ということを見せておきます。
無しだとちゃんと出るっぽいです。ということを見せておきます。
2020/05/21(木) 09:22:26.84ID:r7XP4kDE
>>65
ソ連で生魚にあたって、入院中に病院の天井みてたら思いついたらしいぜ
ソ連で生魚にあたって、入院中に病院の天井みてたら思いついたらしいぜ
2020/05/21(木) 11:21:03.35ID:K4ggzWEW
寄生虫より有毒魚かもな
フグみたいな命取りなやつじゃなくバラムツくらいなら腹壊す程度で済む
フグみたいな命取りなやつじゃなくバラムツくらいなら腹壊す程度で済む
2020/05/21(木) 20:23:36.81ID:U7f5mioC
>>75がどれに対するレスなのか分からんが
みんな単にスルーしてんだろうなこれは
みんな単にスルーしてんだろうなこれは
2020/05/22(金) 07:52:07.46ID:QdrkGYuD
バカって素直だな
ちゃんと返事しやがるw
ちゃんと返事しやがるw
82デフォルトの名無しさん
2020/05/22(金) 13:00:00.65ID:c/ouk/Jn dtmみたいな楽器を作る場合、音は何らかのライブラリを使うんでしょうか?1から作れるんですか?
2020/05/22(金) 14:03:10.66ID:lsrfRepl
は?
オリジナルは普通にサンプルしたものだろ
オリジナルは普通にサンプルしたものだろ
2020/05/22(金) 14:03:38.08ID:lsrfRepl
つまり現実の楽器の音
85デフォルトの名無しさん
2020/05/22(金) 14:08:19.81ID:c/ouk/Jn >>83
シンセとかもサンプルしてるんですか?
シンセとかもサンプルしてるんですか?
2020/05/22(金) 14:39:41.09ID:TUWJypw2
87デフォルトの名無しさん
2020/05/22(金) 14:47:32.08ID:Vl9NL0Mz オートチューン使うと自分の声が楽器みたいになります。
2020/05/22(金) 17:31:59.13ID:Sp8oG6pc
あるクラスのvectorに対し、個々のクラスのメンバのvectorを返すのってラムダ式でサクッと書けると思うのですが、どうやればいいですか?
struct A { int i; };
vector<A> v(10);
auto v_i = 〜ラムダ式〜 // サイズ10のvector<int>が返る
こんな感じです
struct A { int i; };
vector<A> v(10);
auto v_i = 〜ラムダ式〜 // サイズ10のvector<int>が返る
こんな感じです
2020/05/22(金) 17:34:51.45ID:O4ltSfT0
なにいってるのかワカランゴ
2020/05/22(金) 17:40:03.05ID:Wrt3y1wd
[&]{
std::vector<int> ret(v.size());
std::transform(v.begin(),v.end(),ret.begin(),[](A d){return d.i;});
return ret;
}
std::vector<int> ret(v.size());
std::transform(v.begin(),v.end(),ret.begin(),[](A d){return d.i;});
return ret;
}
2020/05/22(金) 17:42:50.71ID:Wrt3y1wd
[](A){...}
のところは&A::iでもいいかな
のところは&A::iでもいいかな
92デフォルトの名無しさん
2020/05/22(金) 17:44:13.14ID:Czx4JK5B2020/05/22(金) 17:59:27.93ID:Sp8oG6pc
なるほど、std::transformを使うのですね
Pythonみたいにサクッとできたらよかったのですが、ちょっとイメージと違いました
ラムダ式に変な期待、というか勘違いしてました
素直にrange for文で個々にemplace_backするほうが短いし分かりやすいので、今回はそうします
ありがとうございました
Pythonみたいにサクッとできたらよかったのですが、ちょっとイメージと違いました
ラムダ式に変な期待、というか勘違いしてました
素直にrange for文で個々にemplace_backするほうが短いし分かりやすいので、今回はそうします
ありがとうございました
2020/05/22(金) 18:03:14.33ID:Wrt3y1wd
pythonだと[d.i for d in v]って所か?
lambdaじゃないけど
lambdaじゃないけど
2020/05/22(金) 18:08:11.35ID:UA0IlUzi
内包表記だな
2020/05/22(金) 19:08:51.35ID:TUWJypw2
97はちみつ餃子 ◆8X2XSCHEME
2020/05/23(土) 00:02:55.12ID:jzsRlJtI range を使えば楽だろうと思ったんだけど view からコンテナに変換する関数は C++20 には入らなかったの?
Range-v3 にある to みたいなやつ。
https://ericniebler.github.io/range-v3/group__group-range.html#ga555b843264809e3765210c42a66d3c3b
Range-v3 にある to みたいなやつ。
https://ericniebler.github.io/range-v3/group__group-range.html#ga555b843264809e3765210c42a66d3c3b
2020/05/23(土) 20:12:53.91ID:Ze0+o2k4
>>87
diva danceみたいに?
diva danceみたいに?
2020/05/27(水) 17:21:37.04ID:UmTuuMOr
gdbのプロンプトでsqrtとかabsみたいな数学の関数使えないんだけど使えるようにする方法ある?
100デフォルトの名無しさん
2020/05/27(水) 17:25:22.27ID:CVgHI0+a さぁ
101デフォルトの名無しさん
2020/05/27(水) 17:52:37.65ID:y56ZMEX8 毎回生成したくない大きめな作業用配列とかって結局どこに持っとくのが良いの?
メンバ変数として?
グローバル変数として?
メンバ変数として?
グローバル変数として?
102デフォルトの名無しさん
2020/05/27(水) 18:36:53.07ID:IG528ewY そんなことで悩むレベルなら毎回生成しろ
たぶんそんなことでは全く遅くはならん
たぶんそんなことでは全く遅くはならん
103デフォルトの名無しさん
2020/05/27(水) 19:02:42.55ID:8V/LyVfK なるべく使う奴にしか見えないスコープに閉じ込めるんだよ
bool1個だろうと10GBの配列だろうと一緒
基本を守るだけだ
bool1個だろうと10GBの配列だろうと一緒
基本を守るだけだ
104デフォルトの名無しさん
2020/05/27(水) 19:50:08.92ID:9+VJvnQZ >>99
$ gdb some_program
(gdb) break main
(gdb) run
(gdb) print ((double(*)(double))sqrt)(2.0)
って感じで使えないかな。
たぶん some_program は何らか libm の関数を取り込んでないとダメだけど。
$ gdb some_program
(gdb) break main
(gdb) run
(gdb) print ((double(*)(double))sqrt)(2.0)
って感じで使えないかな。
たぶん some_program は何らか libm の関数を取り込んでないとダメだけど。
105デフォルトの名無しさん
2020/05/27(水) 20:25:14.60ID:UmTuuMOr106デフォルトの名無しさん
2020/05/27(水) 20:35:36.86ID:8D/pm3yR 作業用の領域の扱いってたしかにいつも悩むんだが、
*) ループや関数の内側で毎回コンテナ (vector, set, queue, etc...) を宣言し、初期化し、使う
と
*) ループや関数の外側にコンテナを宣言しておき、ループや関数の内側で初期化し、使う
だと当然後者の方が低コストで、可読性を大きく損なわない限り後者の方が良いのだよな?
初期化の計算量のオーダーは両者とも同じだが、可変長コンテナのメモリアロケーションの回数を少なくするのが重要だと思って良いのだよな?
*) ループや関数の内側で毎回コンテナ (vector, set, queue, etc...) を宣言し、初期化し、使う
と
*) ループや関数の外側にコンテナを宣言しておき、ループや関数の内側で初期化し、使う
だと当然後者の方が低コストで、可読性を大きく損なわない限り後者の方が良いのだよな?
初期化の計算量のオーダーは両者とも同じだが、可変長コンテナのメモリアロケーションの回数を少なくするのが重要だと思って良いのだよな?
107デフォルトの名無しさん
2020/05/27(水) 20:37:48.66ID:8D/pm3yR もう一個質問
STLコンテナの初期化は空とのswapでやったりすると思うが、この場合コンテナが置かれたメモリの場所は変わらんよな?
つまり、余計なメモリアロケーションは起こらんよな?
STLコンテナの初期化は空とのswapでやったりすると思うが、この場合コンテナが置かれたメモリの場所は変わらんよな?
つまり、余計なメモリアロケーションは起こらんよな?
108デフォルトの名無しさん
2020/05/27(水) 20:45:00.53ID:fWbzFAkP なんかイラっときた
109デフォルトの名無しさん
2020/05/27(水) 20:50:33.85ID:CVgHI0+a なぜ同意を求める?
部下に相槌を打つようにいつも説得しているのか?
お願いします
教えてください
も言えんのか
部下に相槌を打つようにいつも説得しているのか?
お願いします
教えてください
も言えんのか
110デフォルトの名無しさん
2020/05/27(水) 21:47:27.96ID:HrRUxTGO 行単位でファイルを読み込んだあと、パースするような処理で巨大なテキストファイルを扱う場合だと、顕著に後者が速くなる
まあ一度プロファイラで確認してみればいいよ
まあ一度プロファイラで確認してみればいいよ
111はちみつ餃子 ◆8X2XSCHEME
2020/05/27(水) 23:11:34.31ID:OEK6SyHu112デフォルトの名無しさん
2020/05/27(水) 23:13:55.80ID:CVgHI0+a 要素のswapってなんだ?
再配置だろ
再配置だろ
113はちみつ餃子 ◆8X2XSCHEME
2020/05/27(水) 23:26:27.55ID:OEK6SyHu114デフォルトの名無しさん
2020/05/27(水) 23:50:44.02ID:HrRUxTGO 単にgetlineした文字列を
vectorに詰める場合、
getlineしたバッファをmove push_backしたり、shrink_to_fitしてmove
push_backするより、何もせずpush_backでコピーを詰め込んでバッファを使い回しってのが一番速くてメモリ効率もよく、コードもスッキリする
vectorに詰める場合、
getlineしたバッファをmove push_backしたり、shrink_to_fitしてmove
push_backするより、何もせずpush_backでコピーを詰め込んでバッファを使い回しってのが一番速くてメモリ効率もよく、コードもスッキリする
115デフォルトの名無しさん
2020/05/28(木) 00:31:33.05ID:deInkrVp そりゃそうだ
116デフォルトの名無しさん
2020/05/28(木) 05:51:39.46ID:CImYg+b8117デフォルトの名無しさん
2020/05/28(木) 17:31:30.53ID:FcJ3hVy7 Promiseってなんでわざわざfutureを作ってあげなきゃいけないのです?
思想的な話なの?
思想的な話なの?
118デフォルトの名無しさん
2020/05/28(木) 20:27:31.11ID:MpYk07ZW Nowなyoungにバカ受け
119デフォルトの名無しさん
2020/05/28(木) 22:23:48.94ID:deInkrVp 約束ってのは将来果たすためのものだからだよ
120デフォルトの名無しさん
2020/05/29(金) 08:16:47.57ID:eRAtimlp このネーミングセンスには禿も苦笑してたな
121デフォルトの名無しさん
2020/05/29(金) 10:12:51.28ID:pukUYLjc ビャーネ御大と江添のどっちだよ!
122デフォルトの名無しさん
2020/05/31(日) 08:42:17.14ID:iKoRaPmL STLのsetで重複したノードの登録を除外する方法がわかりません
整列基準とするint key1,key2,key3の値にかかわらず、POINT positionが重複する値だったら除外したいのですが、意図した動作になりません
例えば(0,0),(0,1),(1,0),(1,1)の4パターンのみで同一パターンは除外されるようにしたいのに20パターン以上重複して登録されてしまいます
setについてご存知の方いらっしゃいましたらご教示願います
#include <set>
#include <time.h>
#include <windows.h>
using namespace std;
bool operator ==(const POINT& inA, const POINT& inB){ return (inA.x==inB.x)&&(inA.y==inB.y); }
整列基準とするint key1,key2,key3の値にかかわらず、POINT positionが重複する値だったら除外したいのですが、意図した動作になりません
例えば(0,0),(0,1),(1,0),(1,1)の4パターンのみで同一パターンは除外されるようにしたいのに20パターン以上重複して登録されてしまいます
setについてご存知の方いらっしゃいましたらご教示願います
#include <set>
#include <time.h>
#include <windows.h>
using namespace std;
bool operator ==(const POINT& inA, const POINT& inB){ return (inA.x==inB.x)&&(inA.y==inB.y); }
123デフォルトの名無しさん
2020/05/31(日) 08:42:47.02ID:iKoRaPmL //setに入れる要素
class CNode
{
public:
POINT position;
int key1;
int key2;
int key3;
CNode()
{
position.x=rand()%2;
position.y=rand()%2;
key1=rand()%3;
key2=rand()%5;
key3=rand()%10;
}
//setに入れるCNodeポインタを整列する基準を定義
inline bool operator()(const CNode* a, const CNode* b) const
{
//positionの値が同じ要素はsetに登録しない
bool same = (a->position == b->position);
if( same ) return false;
//↑このあたりが怪しい? ここでfalseを返すと登録数が期待よりも多過ぎ、何も返さないと期待よりも少なくなる
//キーでの整列用
if(a->key1 != b->key1) return a->key1 > b->key1;
if(a->key2 != b->key2) return a->key2 > b->key2;
if(a->key3 != b->key3) return a->key3 > b->key3;
return false;
}
};
class CNode
{
public:
POINT position;
int key1;
int key2;
int key3;
CNode()
{
position.x=rand()%2;
position.y=rand()%2;
key1=rand()%3;
key2=rand()%5;
key3=rand()%10;
}
//setに入れるCNodeポインタを整列する基準を定義
inline bool operator()(const CNode* a, const CNode* b) const
{
//positionの値が同じ要素はsetに登録しない
bool same = (a->position == b->position);
if( same ) return false;
//↑このあたりが怪しい? ここでfalseを返すと登録数が期待よりも多過ぎ、何も返さないと期待よりも少なくなる
//キーでの整列用
if(a->key1 != b->key1) return a->key1 > b->key1;
if(a->key2 != b->key2) return a->key2 > b->key2;
if(a->key3 != b->key3) return a->key3 > b->key3;
return false;
}
};
124デフォルトの名無しさん
2020/05/31(日) 08:43:16.96ID:iKoRaPmL typedef set<CNode*, CNode> NODE_POINTER_SET;
int main()
{
srand((unsigned)time(NULL));
int NUM=100;
printf("setへの登録候補数:%d\n",NUM);
CNode* dammy[1];
NODE_POINTER_SET NodePointerSet(dammy, dammy+0, CNode());
CNode* node;
for(int i=0; i<NUM; i++)
{
node = new CNode();
printf("%x:(%d,%d)【%3d %3d %3d】をセットへ\n"
,node
,node->position.x, node->position.y
,node->key1, node->key2, node->key3 );
pair<NODE_POINTER_SET::iterator, bool> insert_result = NodePointerSet.insert(node); //setへ登録
if( false == insert_result.second ) delete node; //重複で登録できなかった場合は確保したメモリを破棄
}
printf("\nset内に登録された要素数:%d\n",NodePointerSet.size());
for(NODE_POINTER_SET::const_iterator it=NodePointerSet.begin(); it!=NodePointerSet.end(); )
{
printf("%x:(%d,%d)【%3d %3d %3d】をセットから\n"
,*it
,(*it)->position.x, (*it)->position.y
,(*it)->key1, (*it)->key2, (*it)->key3 );
delete (*it); //メモリの後始末
it=NodePointerSet.erase(it); //setから削除 itは次の要素を指す
}
}
int main()
{
srand((unsigned)time(NULL));
int NUM=100;
printf("setへの登録候補数:%d\n",NUM);
CNode* dammy[1];
NODE_POINTER_SET NodePointerSet(dammy, dammy+0, CNode());
CNode* node;
for(int i=0; i<NUM; i++)
{
node = new CNode();
printf("%x:(%d,%d)【%3d %3d %3d】をセットへ\n"
,node
,node->position.x, node->position.y
,node->key1, node->key2, node->key3 );
pair<NODE_POINTER_SET::iterator, bool> insert_result = NodePointerSet.insert(node); //setへ登録
if( false == insert_result.second ) delete node; //重複で登録できなかった場合は確保したメモリを破棄
}
printf("\nset内に登録された要素数:%d\n",NodePointerSet.size());
for(NODE_POINTER_SET::const_iterator it=NodePointerSet.begin(); it!=NodePointerSet.end(); )
{
printf("%x:(%d,%d)【%3d %3d %3d】をセットから\n"
,*it
,(*it)->position.x, (*it)->position.y
,(*it)->key1, (*it)->key2, (*it)->key3 );
delete (*it); //メモリの後始末
it=NodePointerSet.erase(it); //setから削除 itは次の要素を指す
}
}
125蟻人間 ◆T6xkBnTXz7B0
2020/05/31(日) 08:47:50.96ID:KExNe49d std::setの整列はlessでstd::unordered_setは整列せずでequalだったと思う。
たぶん近藤してる。
たぶん近藤してる。
126蟻人間 ◆T6xkBnTXz7B0
2020/05/31(日) 08:55:43.87ID:KExNe49d スマポ使わずにdelete使うのは古いよ。
127デフォルトの名無しさん
2020/05/31(日) 09:07:29.52ID:iKoRaPmL >>125
すみません、もう少し詳しくお教え頂けないでしょうか
初心者で見よう見まねでやっているので…
整列はできているのですが、除外がうまく動かないかんじです
スマートポインタは、難しそうなので私にはまだ早いと思っています
(でも、そのうち取り組みたい)
すみません、もう少し詳しくお教え頂けないでしょうか
初心者で見よう見まねでやっているので…
整列はできているのですが、除外がうまく動かないかんじです
スマートポインタは、難しそうなので私にはまだ早いと思っています
(でも、そのうち取り組みたい)
128蟻人間 ◆T6xkBnTXz7B0
2020/05/31(日) 09:13:01.00ID:KExNe49d std::setとstd::unordered_setの規格票を参照。テンプレート引数の最初は値。その次の引数は比較になっている。比較だけど、その比較はequalかlessなのかが問題だ。
lessというのは、不等号で書くと<。
equalというのは、==という意味。
lessというのは、不等号で書くと<。
equalというのは、==という意味。
129デフォルトの名無しさん
2020/05/31(日) 09:41:05.74ID:TtXgrlrn >>127
最初は見よう見まねなのは仕方ないけど、関数の仕様を解説してるページを探して仕様を確認する癖をつけるといいぞ。
最初は見よう見まねなのは仕方ないけど、関数の仕様を解説してるページを探して仕様を確認する癖をつけるといいぞ。
130デフォルトの名無しさん
2020/05/31(日) 09:48:26.67ID:zTMn2qwy まずstd::setについて調べると
https://cpprefjp.github.io/reference/set/set.html
Compareは狭義の弱順序において前ならtrueとある
狭義の弱順序のリンクをたどると
https://cpprefjp.github.io/reference/algorithm.html#strict-weak-ordering
!comp(a, b) && !comp(b, a) として equiv(a, b) を定義する場合、
equiv(a, b) && equiv(b, c) は equiv(a, c) を意味する必要があると書いてある。
あなたの作った比較関数は、この条件を満たさない。
{{0,0},0,0,0}=={{0,1},0,0,0}=={0,1},0,0,1}だが、{{0,0},0,0,0}!={0,1},0,0,1}となってしまう。
https://cpprefjp.github.io/reference/set/set.html
Compareは狭義の弱順序において前ならtrueとある
狭義の弱順序のリンクをたどると
https://cpprefjp.github.io/reference/algorithm.html#strict-weak-ordering
!comp(a, b) && !comp(b, a) として equiv(a, b) を定義する場合、
equiv(a, b) && equiv(b, c) は equiv(a, c) を意味する必要があると書いてある。
あなたの作った比較関数は、この条件を満たさない。
{{0,0},0,0,0}=={{0,1},0,0,0}=={0,1},0,0,1}だが、{{0,0},0,0,0}!={0,1},0,0,1}となってしまう。
131デフォルトの名無しさん
2020/05/31(日) 10:48:27.53ID:zTMn2qwy もう少しざっくりとした説明。
setは、ソートした後に、等しい要素が隣同士に並ぶことを前提としている。
これにより、隣り合った要素とだけ重複判定することで効率化している。
しかし、問題の比較関数でソートしても、等しい要素が隣同士に並ぶとは限らない。
{{0,1},0,0,6}, {{0,3},0,0,4}, {{0,1},0,0,2}
のような要素列を、この比較関数でソートしても、順序は変わらない。
先頭と末尾が等しいはずなのに隣り合っていないため、重複判定が行われない。
setは、ソートした後に、等しい要素が隣同士に並ぶことを前提としている。
これにより、隣り合った要素とだけ重複判定することで効率化している。
しかし、問題の比較関数でソートしても、等しい要素が隣同士に並ぶとは限らない。
{{0,1},0,0,6}, {{0,3},0,0,4}, {{0,1},0,0,2}
のような要素列を、この比較関数でソートしても、順序は変わらない。
先頭と末尾が等しいはずなのに隣り合っていないため、重複判定が行われない。
132デフォルトの名無しさん
2020/05/31(日) 11:51:01.53ID:iKoRaPmL 難しいですね…
つまり
//positionの値が同じ要素はsetに登録しない
bool same = (a->position == b->position);
if( same ) return false;
のところをどう書き直したら動くのでしょうか?
どうか教えて下さい
m(_ _)mこのとおり!
つまり
//positionの値が同じ要素はsetに登録しない
bool same = (a->position == b->position);
if( same ) return false;
のところをどう書き直したら動くのでしょうか?
どうか教えて下さい
m(_ _)mこのとおり!
133デフォルトの名無しさん
2020/05/31(日) 11:53:09.13ID:27DcnLkI 弱順序とか区分化とかあの説明だけで理解できたら天才だろ
だから群論・集合論の教科書を数冊読むとC++がスラスラと理解できるようになる
だから群論・集合論の教科書を数冊読むとC++がスラスラと理解できるようになる
134デフォルトの名無しさん
2020/05/31(日) 11:53:23.87ID:J1D5Z9UC 自分でやる気がない人に教える気にはならないなぁ。
135デフォルトの名無しさん
2020/05/31(日) 12:02:25.63ID:6nfzU/vT bool CNode::operator<(const CNode& rhs) const {
if (key1 != rhs.key1) { return (key1 < rhs.key1); }
else if (key2 != rhs.key2) { return (key2 < rhs.key2); }
else if (key3 != rhs.key3) { return (key3 < rhs.key3); }
else { return false; }
}
を実装したら最低限逝ける、
等値演算子「==」は、それがCNodeのメソッドまたはCNode&を引数にとる
関数定義がなされていなければ(!(a < b) && !(b < a))で遂行される
ただしそれでは効率が悪いので(「==」1回につきoperator<()が2回呼ばれるので)、
「==」も手動で実装したらモアベターではある
if (key1 != rhs.key1) { return (key1 < rhs.key1); }
else if (key2 != rhs.key2) { return (key2 < rhs.key2); }
else if (key3 != rhs.key3) { return (key3 < rhs.key3); }
else { return false; }
}
を実装したら最低限逝ける、
等値演算子「==」は、それがCNodeのメソッドまたはCNode&を引数にとる
関数定義がなされていなければ(!(a < b) && !(b < a))で遂行される
ただしそれでは効率が悪いので(「==」1回につきoperator<()が2回呼ばれるので)、
「==」も手動で実装したらモアベターではある
136デフォルトの名無しさん
2020/05/31(日) 12:12:06.34ID:zTMn2qwy137デフォルトの名無しさん
2020/05/31(日) 12:25:20.78ID:HQ8vNkm/ そもそもCNodeにoperator<実装してないのになんでコンパイル通ってんのか謎
隠してるコードがあるなら全部出せ
隠してるコードがあるなら全部出せ
138デフォルトの名無しさん
2020/05/31(日) 12:45:05.74ID:J1D5Z9UC >>137
> typedef set<CNode*, CNode> NODE_POINTER_SET;
> typedef set<CNode*, CNode> NODE_POINTER_SET;
139蟻人間 ◆T6xkBnTXz7B0
2020/05/31(日) 12:51:20.01ID:KExNe49d inline bool operator()(const CNode* a, const CNode* b) const
{
if(a->key1 < b->key1) return true;
if(a->key1 > b->key1) return false;
if(a->key2 < b->key2) return true;
if(a->key2 > b->key2) return false;
if(a->key3 < b->key3) return true;
if(a->key3 > b->key3) return false;
//ここまでヒント。
}
{
if(a->key1 < b->key1) return true;
if(a->key1 > b->key1) return false;
if(a->key2 < b->key2) return true;
if(a->key2 > b->key2) return false;
if(a->key3 < b->key3) return true;
if(a->key3 > b->key3) return false;
//ここまでヒント。
}
140デフォルトの名無しさん
2020/05/31(日) 12:58:31.73ID:6nfzU/vT >//positionの値が同じ要素はsetに登録しない
>bool same = (a->position == b->position);
>if( same ) return false;
仕様誤解してたサーセンgrz、、
>bool same = (a->position == b->position);
>if( same ) return false;
仕様誤解してたサーセンgrz、、
141デフォルトの名無しさん
2020/05/31(日) 13:17:45.26ID:iKoRaPmL 皆様ありがとうございます
>>135
なるほど、<が2回呼ばれるのですか(いろいろ試していて2回ずつカウントされているのを不思議に思ってました)
ご紹介頂いたコードを追加しましたが、rhsがポインタでないせいか効果がありませんでした
ポインタを、そのメンバ変数基準で整列させたいのですが、
bool operator<(const CNode* lhs, const CNode* rhs)const
で定義しようとするとコンパイルエラーC2804
binary 'operator <' に引数が多すぎます。
になってしまいます
==演算子も同様に駄目でした
<や==演算子オーバーロードでポインタを整列させる事は無理なのでしょうか?
>>140
の内容からすると、無理なのかな?
(自分で試してみて無理そうだと思ったので、仕方なく()オーバーロードで定義を書いていました)
>>139
ヒント見ても理解できないこの無能な鈍物めにお答えを賜りたく
どうかお願いします!
>>135
なるほど、<が2回呼ばれるのですか(いろいろ試していて2回ずつカウントされているのを不思議に思ってました)
ご紹介頂いたコードを追加しましたが、rhsがポインタでないせいか効果がありませんでした
ポインタを、そのメンバ変数基準で整列させたいのですが、
bool operator<(const CNode* lhs, const CNode* rhs)const
で定義しようとするとコンパイルエラーC2804
binary 'operator <' に引数が多すぎます。
になってしまいます
==演算子も同様に駄目でした
<や==演算子オーバーロードでポインタを整列させる事は無理なのでしょうか?
>>140
の内容からすると、無理なのかな?
(自分で試してみて無理そうだと思ったので、仕方なく()オーバーロードで定義を書いていました)
>>139
ヒント見ても理解できないこの無能な鈍物めにお答えを賜りたく
どうかお願いします!
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 空自機レーダー照射、音声データ公開 中国 ★2 [蚤の市★]
- 中国とロシアの爆撃機、日本周辺で共同飛行 [少考さん★]
- 「中国側も日本機のレーダーを感知していた」 中国メディアが報道 [♪♪♪★]
- 【YouTuber】バイク事故で入院のゆたぼん、振込で「お見舞金」募る [muffin★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 高市早苗首相、消費税減税に後ろ向き 足かせはレジシステム? 「責任ある積極財政」期待高いが [蚤の市★]
- 防衛省、中国を完全論破www 「事前通告があったのは海自であって空自ではない」 高市早苗勝利 [175344491]
- 【悲惨】中国軍が自衛隊に「事前通告」し自衛隊も返答した音声が公開されてしまうwwwこれは高市チェックアウトゕ★4 [597533159]
- 【悲報】JA「全然米が売れなくて倉庫を圧迫してる。助けて!」米卸売り業者「安売りしたら赤字になる…助けて!」 [802034645]
- 元統合幕僚長「演習通告の音声は公開されたが、レーダー照射時のものではない」高市政府「www」 [834922174]
- 韓国政府、高市早苗の「竹島領土」発言にブチギレwwwwwwwwwwwwwwww [834922174]
- 【急募】佐藤健(37)さんが急にバカにされ始めた理由WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
