C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part148
https://mevius.5ch.net/test/read.cgi/tech/1580471646/
このスレもよろしくね。
【初心者歓迎】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++相談室 part149
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/02/18(火) 06:19:41.54ID:xvjipUWj736デフォルトの名無しさん
2020/03/06(金) 20:27:49.81ID:hYOq9QPM737デフォルトの名無しさん
2020/03/06(金) 21:30:02.51ID:ytQa5naT やりたくない奴はやらなきゃいいだけ
この機能はあった方がいい
ないとrawから離れてしまうのは君自身が>713で例示している
この機能はあった方がいい
ないとrawから離れてしまうのは君自身が>713で例示している
738デフォルトの名無しさん
2020/03/06(金) 22:02:29.04ID:Oq5LDxMU739デフォルトの名無しさん
2020/03/07(土) 00:05:13.96ID:aYdkWxa2 >>51
We regret to inform you that we are shutting down code.hackerearth.com.
Apologies for any inconvenience caused.
Thank you for understanding.
We regret to inform you that we are shutting down code.hackerearth.com.
Apologies for any inconvenience caused.
Thank you for understanding.
740デフォルトの名無しさん
2020/03/07(土) 01:02:00.91ID:aYdkWxa2 >>740
それは https://code.hackerearth.com の今のメッセージですね、サーバーシャットダウン中でごめんなさい、ですか
ではこちらをみてください https://code.hackerearth.com/11eea6E>>740
それは https://code.hackerearth.com の今のメッセージですね、サーバーシャットダウン中でごめんなさい、ですか
ではこちらをみてください https://code.hackerearth.com/11eea6E>>740
742デフォルトの名無しさん
2020/03/07(土) 01:33:50.20ID:aYdkWxa2 >>742
申し訳ございません、コードを ideone に張ったものと記憶違いをしていました
>>735 より前のバージョンを https://mevius.5ch.net/test/read.cgi/tech/1434079972/37 に置いています
申し訳ございません、コードを ideone に張ったものと記憶違いをしていました
>>735 より前のバージョンを https://mevius.5ch.net/test/read.cgi/tech/1434079972/37 に置いています
744デフォルトの名無しさん
2020/03/07(土) 07:24:46.08ID:HWBpZxET >>729
> ただやはりpythonはエスケープフリーで任意の文字を含められない点で機能が不完全
だから前にも書いたけどそんな機会がどんだけあるんだよって話な
ぱっと思いつくのは " や ' を含む正規表現を書きたい時ぐらいだけど毎回そんなものを書かないだろ
めったに無い時のために毎回無駄な ( ) を書かされるのはちょっと嫌
※ 最後の行は個人の見解です
> ただやはりpythonはエスケープフリーで任意の文字を含められない点で機能が不完全
だから前にも書いたけどそんな機会がどんだけあるんだよって話な
ぱっと思いつくのは " や ' を含む正規表現を書きたい時ぐらいだけど毎回そんなものを書かないだろ
めったに無い時のために毎回無駄な ( ) を書かされるのはちょっと嫌
※ 最後の行は個人の見解です
745デフォルトの名無しさん
2020/03/07(土) 08:46:17.40ID:CT6knIM5 すみません、教えてください
JAVAだとinterfaceを定義してsetListner的なことが出来て、リスナー不要なときはnullを指定できます。
C++だとどうかけばいいでしょうか?
interface用のクラスを一つ用意してvirtualメソッドを並べれば出来そうな気がしますが、リスナー不要な時に上位からnullを指定できない気がしていて
JAVAだとinterfaceを定義してsetListner的なことが出来て、リスナー不要なときはnullを指定できます。
C++だとどうかけばいいでしょうか?
interface用のクラスを一つ用意してvirtualメソッドを並べれば出来そうな気がしますが、リスナー不要な時に上位からnullを指定できない気がしていて
746デフォルトの名無しさん
2020/03/07(土) 09:53:24.66ID:iUAwzQ87 std::functionが一番簡単だと思いますが。
747デフォルトの名無しさん
2020/03/07(土) 10:21:48.59ID:CT6knIM5 ありがとうございます。
具体的なコードを教えて頂けないでしょうか?
例えば、適当に拾った以下のJavaコードを例にして同じ事を出来るとC++のサンプルを教えて頂けると参考になります。
続く
具体的なコードを教えて頂けないでしょうか?
例えば、適当に拾った以下のJavaコードを例にして同じ事を出来るとC++のサンプルを教えて頂けると参考になります。
続く
748デフォルトの名無しさん
2020/03/07(土) 10:21:58.29ID:CT6knIM5 class HeavyTask {
private TestListener listener;
// interface 設定
interface TestListener {
void onSuccess(int result);
}
// listener
void setListener(TestListener listener) {
this.listener = listener;
}
void taskStart() {
int sum = 1;
int i= 0;
for ( ; i< 20; ){
sum += sum;
i++;
}
if(listener != null) {
// 計算が終わったら結果をlistenerに渡す
listener.onSuccess(sum);
}
}
}
private TestListener listener;
// interface 設定
interface TestListener {
void onSuccess(int result);
}
// listener
void setListener(TestListener listener) {
this.listener = listener;
}
void taskStart() {
int sum = 1;
int i= 0;
for ( ; i< 20; ){
sum += sum;
i++;
}
if(listener != null) {
// 計算が終わったら結果をlistenerに渡す
listener.onSuccess(sum);
}
}
}
749デフォルトの名無しさん
2020/03/07(土) 11:01:38.19ID:iUAwzQ87 え?めんどくさいですが?
750デフォルトの名無しさん
2020/03/07(土) 11:04:48.12ID:CT6knIM5 すみません、簡単な例でいいので、リスナー登録してそこから複数のメソッドがイベント毎に呼ばれるようにする方法がしりたいです。。
751デフォルトの名無しさん
2020/03/07(土) 11:09:04.29ID:iUAwzQ87 std::functionは関数っぽいものなら何でも突っ込めるので、好きなようにお使いくださいとしか。
本当は出来ないんだろ?とか煽ればだれか書いてくれるかも。
本当は出来ないんだろ?とか煽ればだれか書いてくれるかも。
752デフォルトの名無しさん
2020/03/07(土) 11:13:54.29ID:CT6knIM5 まだイメージが沸かないですよね。。使い方も
753デフォルトの名無しさん
2020/03/07(土) 11:20:59.13ID:NiWYPfBM 最初に自分がいってるとおりじゃないんか
インターフェイスの派生クラスのポインタ渡せばいいだけで
不要なら0入れて呼ぶときにチェックするだけじゃないの
インターフェイスの派生クラスのポインタ渡せばいいだけで
不要なら0入れて呼ぶときにチェックするだけじゃないの
754デフォルトの名無しさん
2020/03/07(土) 11:27:48.77ID:AiHnVJpq てか、C++でもほとんど>>748と同じようなコードになるだろ
755デフォルトの名無しさん
2020/03/07(土) 12:03:07.45ID:CT6knIM5 具体的にfuntionを使って、リスナーをnewして呼び出すあたりとかコードがみたいです。。virtualだと誰かが継承してクラス化しないとだめですよね?
Javaのように、setListenerの引数にリスナーだけnewしてしていとか、null指定とかする方法がやっぱりよくわからないです。
Javaのように、setListenerの引数にリスナーだけnewしてしていとか、null指定とかする方法がやっぱりよくわからないです。
756デフォルトの名無しさん
2020/03/07(土) 12:05:29.33ID:qpmtEUNF そのjava版晒せば変換してやるが
757デフォルトの名無しさん
2020/03/07(土) 12:06:49.73ID:CT6knIM5 ちょっとまってください
758デフォルトの名無しさん
2020/03/07(土) 12:07:03.25ID:NiWYPfBM クラス化してポインタで管理するだけ
javaみたくnewでそのままオーバーライドはできないと思う
やりようあるんかな
javaみたくnewでそのままオーバーライドはできないと思う
やりようあるんかな
759デフォルトの名無しさん
2020/03/07(土) 12:10:36.55ID:NiWYPfBM newしてラムダ式でも渡せばできるか
760デフォルトの名無しさん
2020/03/07(土) 12:12:57.85ID:qpmtEUNF new要らんのでは?
761デフォルトの名無しさん
2020/03/07(土) 12:21:54.31ID:CT6knIM5 すみませんが、これでお願いします。
C++のfunctionを利用して、一番スマートな感じなコードを教えてください。
m(__)m
続く↓
C++のfunctionを利用して、一番スマートな感じなコードを教えてください。
m(__)m
続く↓
762デフォルトの名無しさん
2020/03/07(土) 12:22:53.25ID:CT6knIM5 // 上位からやりたいこと
class Main {
Test test = new Test();
test.setListener(null); // callback不要な時はnullを指定したい
// callbackが欲しい時はこんな感じで登録したい
test.setListener(new Test.TestListener() {
@Override
onSuccess(int result) {
System.out.println(result);
}
@Override
onError(int errorCode) {
System.out.println(errorCode);
}
});
test.run();
}
続く↓
class Main {
Test test = new Test();
test.setListener(null); // callback不要な時はnullを指定したい
// callbackが欲しい時はこんな感じで登録したい
test.setListener(new Test.TestListener() {
@Override
onSuccess(int result) {
System.out.println(result);
}
@Override
onError(int errorCode) {
System.out.println(errorCode);
}
});
test.run();
}
続く↓
763デフォルトの名無しさん
2020/03/07(土) 12:23:36.37ID:CT6knIM5 // Testの中身の作りはどうでもいいです。
// Main側からTest側が綺麗に呼び出せれば、それに合わせてTest側を作りかえるでOKです。
class Test {
interface TestListener {
void onSuccess(int result);
void onError(int errorCode);
}
private TestListener listener;
void setListener(TestListener listener) {
this.listener = listener;
}
void run() {
if (listener != null) {
listener.onSuccess(0);
listener.onError(1);
}
}
}
// Main側からTest側が綺麗に呼び出せれば、それに合わせてTest側を作りかえるでOKです。
class Test {
interface TestListener {
void onSuccess(int result);
void onError(int errorCode);
}
private TestListener listener;
void setListener(TestListener listener) {
this.listener = listener;
}
void run() {
if (listener != null) {
listener.onSuccess(0);
listener.onError(1);
}
}
}
764デフォルトの名無しさん
2020/03/07(土) 12:24:15.53ID:CT6knIM5 スペースがちゃんと入ってなく、見づらくて申し訳ないです。
よろしくお願いしますm(__)m
よろしくお願いしますm(__)m
765デフォルトの名無しさん
2020/03/07(土) 12:37:30.49ID:+VsyTV1D こんな自分でやる気のない人にはぜひエサを与えないでほしい。
766デフォルトの名無しさん
2020/03/07(土) 12:39:57.68ID:iUAwzQ87 いや、困ってるみたいだし、書いてやれよ。
俺がケチョンケチョンに添削してやるから。
俺がケチョンケチョンに添削してやるから。
767デフォルトの名無しさん
2020/03/07(土) 12:40:37.61ID:CT6knIM5 やる気がないわけではなくて、勉強しているけどどう書くのか分からないだけです。。
768デフォルトの名無しさん
2020/03/07(土) 12:45:37.23ID:CT6knIM5 C++だと、イメージだけど
test.setListener([](int result)) { print(result); });
みたいにかけそうってのはわかりましたが。。
NULL指定したい時とか複数のoverride対象の
メソッドを並べる書き方とか良く分からず。
test.setListener([](int result)) { print(result); });
みたいにかけそうってのはわかりましたが。。
NULL指定したい時とか複数のoverride対象の
メソッドを並べる書き方とか良く分からず。
769蟻人間 ◆T6xkBnTXz7B0
2020/03/07(土) 13:05:14.05ID:ECZE2b67 class TestListener {
public:
virtual void onSuccess(int result) { }
virtual void onError(int errorCode) { }
};
public:
virtual void onSuccess(int result) { }
virtual void onError(int errorCode) { }
};
770蟻人間 ◆T6xkBnTXz7B0
2020/03/07(土) 13:09:06.48ID:ECZE2b67 class Test {
private:
TestListener *m_listener;
public:
Test() : m_listener(NULL) { }
void setListener(TestListener *listener) {
m_listener = listener;
}
void run() {
if (m_listener != NULL) {
m_listener->onSuccess(0);
m_listener->onError(1);
}
};
private:
TestListener *m_listener;
public:
Test() : m_listener(NULL) { }
void setListener(TestListener *listener) {
m_listener = listener;
}
void run() {
if (m_listener != NULL) {
m_listener->onSuccess(0);
m_listener->onError(1);
}
};
771デフォルトの名無しさん
2020/03/07(土) 13:10:29.44ID:qpmtEUNF772デフォルトの名無しさん
2020/03/07(土) 13:12:54.90ID:0g+cGFce773蟻人間 ◆T6xkBnTXz7B0
2020/03/07(土) 13:13:53.37ID:ECZE2b67 class MyListener : public TestListener {
public:
virtual void onSuccess(int result) {
printf("だから何?\n");
}
virtual void onError(int errorCode) {
printf("100年ROMってろ\n");
}
};
Test test;
MyListener lis;
test.setListener(&lis);
test.run();
public:
virtual void onSuccess(int result) {
printf("だから何?\n");
}
virtual void onError(int errorCode) {
printf("100年ROMってろ\n");
}
};
Test test;
MyListener lis;
test.setListener(&lis);
test.run();
774デフォルトの名無しさん
2020/03/07(土) 13:18:44.05ID:CT6knIM5775772
2020/03/07(土) 13:20:39.61ID:0g+cGFce776デフォルトの名無しさん
2020/03/07(土) 13:20:43.30ID:CT6knIM5 ちょっと試してみます
777デフォルトの名無しさん
2020/03/07(土) 14:15:14.60ID:CT6knIM5 ありがとうございました。
内容は大体理解できたので、今後のテンプレとして使わせていただきます。
助かりました!
内容は大体理解できたので、今後のテンプレとして使わせていただきます。
助かりました!
778デフォルトの名無しさん
2020/03/08(日) 22:16:34.90ID:51E2S4Dp http://codepad.org/4KkPN9ki
上記を実行すると下記結果になります。
[2]を見ると、vectorの3つ目以降はポインタのアドレスがあうのですが、2つ目までは合っていません。
MAPの方にはvectorのポインタを渡しているつもりなので、[2]のアドレスはvectorのアドレスと一致する。
が期待値なのですが、理由はわかりますでしょうか?
[1]
VECTOR ABC 0x144dd20
VECTOR DEF 0x144dd28
VECTOR GHI 0x144dd30
[2]
MAP itr GHI 0x144dd30 ←vectorの3つ目以降はポインタが一致する
MAP itr ABC 0x144dc20
MAP itr DEF 0x144dcc8
[3]
VECTOR for_each ABC 0x144dd20
VECTOR for_each DEF 0x144dd28
VECTOR for_each GHI 0x144dd30
上記を実行すると下記結果になります。
[2]を見ると、vectorの3つ目以降はポインタのアドレスがあうのですが、2つ目までは合っていません。
MAPの方にはvectorのポインタを渡しているつもりなので、[2]のアドレスはvectorのアドレスと一致する。
が期待値なのですが、理由はわかりますでしょうか?
[1]
VECTOR ABC 0x144dd20
VECTOR DEF 0x144dd28
VECTOR GHI 0x144dd30
[2]
MAP itr GHI 0x144dd30 ←vectorの3つ目以降はポインタが一致する
MAP itr ABC 0x144dc20
MAP itr DEF 0x144dcc8
[3]
VECTOR for_each ABC 0x144dd20
VECTOR for_each DEF 0x144dd28
VECTOR for_each GHI 0x144dd30
779デフォルトの名無しさん
2020/03/08(日) 23:05:19.29ID:SIolBUWz emplace_back()の時にvectorのサイズが拡張されて中身が再配置されることがある
そうなると拡張前に取ったポインタは無効になる
嫌だったらvectorの挿入削除が一通り終わってからポインタ取るとか、
必要量でreserve()して再配置されないようにするとか、deque使うとかその辺
そうなると拡張前に取ったポインタは無効になる
嫌だったらvectorの挿入削除が一通り終わってからポインタ取るとか、
必要量でreserve()して再配置されないようにするとか、deque使うとかその辺
780デフォルトの名無しさん
2020/03/09(月) 07:24:49.77ID:50Nkxt/s vector<int> v があるとして、
for(auto i: v)
というループの中で v の要素を変更したときの挙動って言語仕様として決まってるの?
あと、
for(auto i: set<int>(v.begin(), v.end()))
みたいなループを書いたときって set の定義を外に出したときと比べてパフォーマンス上の違いある?
for(auto i: v)
というループの中で v の要素を変更したときの挙動って言語仕様として決まってるの?
あと、
for(auto i: set<int>(v.begin(), v.end()))
みたいなループを書いたときって set の定義を外に出したときと比べてパフォーマンス上の違いある?
781デフォルトの名無しさん
2020/03/09(月) 07:59:37.36ID:kzUaYlzv &
782デフォルトの名無しさん
2020/03/09(月) 08:17:06.64ID:aBhFrWy9 >>780
for(auto e: vec){ statement }
はこんな感じで展開される
{
auto && __range = vec;
for (auto __begin = begin(__range), __end = end(__range); __begin != __end; ++__begin) {
auto e = *__begin;
statement
}
}
ポイントとしては内部でイテレータを使ってるからイテレータ無効化ルールに抵触したらおかしな動きになる
(ループの中でvec.push_back()をするとか)。
二つ目の質問については、上の例の
auto && __range = vec;
のように最初に定義域を右辺値参照で取ってるからsetの定義を外に出す必要はない
for(auto e: vec){ statement }
はこんな感じで展開される
{
auto && __range = vec;
for (auto __begin = begin(__range), __end = end(__range); __begin != __end; ++__begin) {
auto e = *__begin;
statement
}
}
ポイントとしては内部でイテレータを使ってるからイテレータ無効化ルールに抵触したらおかしな動きになる
(ループの中でvec.push_back()をするとか)。
二つ目の質問については、上の例の
auto && __range = vec;
のように最初に定義域を右辺値参照で取ってるからsetの定義を外に出す必要はない
783はちみつ餃子 ◆8X2XSCHEME
2020/03/09(月) 10:20:22.51ID:CscrLobz >>778
vector のイテレータが無効になる条件。
https://ja.cppreference.com/w/cpp/container/vector#.E3.82.A4.E3.83.86.E3.83.AC.E3.83.BC.E3.82.BF.E3.81.AE.E7.84.A1.E5.8A.B9.E5.8C.96
emplace_back の場合はそれを実行した後の size() が capacity() より大きいときにイテレータが無効になる。
https://ja.cppreference.com/w/cpp/container/vector/emplace_back
vector は要素が必ず隣接したアドレスに配置されるというルールなので
連続したアドレスで拡張することが出来なければ再配置することがある。
C で言うところの realloc みたいなこと。
要素の数が増えるような操作はだいたいイテレータを無効にすると覚えておけばいい。
vector のイテレータが無効になる条件。
https://ja.cppreference.com/w/cpp/container/vector#.E3.82.A4.E3.83.86.E3.83.AC.E3.83.BC.E3.82.BF.E3.81.AE.E7.84.A1.E5.8A.B9.E5.8C.96
emplace_back の場合はそれを実行した後の size() が capacity() より大きいときにイテレータが無効になる。
https://ja.cppreference.com/w/cpp/container/vector/emplace_back
vector は要素が必ず隣接したアドレスに配置されるというルールなので
連続したアドレスで拡張することが出来なければ再配置することがある。
C で言うところの realloc みたいなこと。
要素の数が増えるような操作はだいたいイテレータを無効にすると覚えておけばいい。
784デフォルトの名無しさん
2020/03/09(月) 22:02:02.24ID:0hJmIbuo785デフォルトの名無しさん
2020/03/09(月) 22:50:43.87ID:yYcTR1n2 inlineについて質問です。
ttps://qiita.com/omuRice/items/9e31d9ba17b32703b3b1
上記を見ると下記のように書いてあります。
//ヘッダファイルでしかinlineで定義できない
//別ファイルで書くとinline展開の時にエラーになる.
しかしヘッダファイルではなく、クラスの本体ファイルの方に書いてもエラーになりませんでした。
c++11を使っているのですが、最新ではエラーになるということでしょうか?
ttps://qiita.com/omuRice/items/9e31d9ba17b32703b3b1
上記を見ると下記のように書いてあります。
//ヘッダファイルでしかinlineで定義できない
//別ファイルで書くとinline展開の時にエラーになる.
しかしヘッダファイルではなく、クラスの本体ファイルの方に書いてもエラーになりませんでした。
c++11を使っているのですが、最新ではエラーになるということでしょうか?
786デフォルトの名無しさん
2020/03/09(月) 23:35:25.22ID:XT24roZc よく読めよ
(本来だったら、ヘッダファイルにクラス定義をしてメンバ関数の実装は別ファイルで行なった方が適切です。(Allocationエラーを防げる))
(本来だったら、ヘッダファイルにクラス定義をしてメンバ関数の実装は別ファイルで行なった方が適切です。(Allocationエラーを防げる))
787デフォルトの名無しさん
2020/03/09(月) 23:41:32.15ID:otQrr6l+ inline関数を定義したファイル内からそのinline関数を呼ぶ分にはエラーにならない
別ファイルでmyClass.hppをインクルードしてinline関数を呼ぼうとするとエラーになる
という意味ではないだろうか
別ファイルでmyClass.hppをインクルードしてinline関数を呼ぼうとするとエラーになる
という意味ではないだろうか
788デフォルトの名無しさん
2020/03/09(月) 23:48:35.15ID:yYcTR1n2 >>787
なるほど。
自身のファイルならinlineの関数も見えているから展開できる。
他のファイルで使うときはinline展開する中身が見えないからエラーになる。
というのがしっくりきそうですね。
なるほど。
自身のファイルならinlineの関数も見えているから展開できる。
他のファイルで使うときはinline展開する中身が見えないからエラーになる。
というのがしっくりきそうですね。
789デフォルトの名無しさん
2020/03/10(火) 17:39:07.74ID:CIHR5C1w そのAllocationエラーを防げる、って何の話だろう
790デフォルトの名無しさん
2020/03/10(火) 18:47:12.48ID:VUvg76Dj 上のqiitaは初心者っぽいし正しいことを書いてるとは限らない
792デフォルトの名無しさん
2020/03/10(火) 19:21:46.83ID:VUvg76Dj 今のinlineの意味は「同じ定義である限り何度でも定義していいよ」だからな
展開云々はコンパイラが勝手にやる話であってプログラマが指定する話ではない
上のqiitaの人は昔のネット記事を読みながら勉強したんだろう
展開云々はコンパイラが勝手にやる話であってプログラマが指定する話ではない
上のqiitaの人は昔のネット記事を読みながら勉強したんだろう
793はちみつ餃子 ◆8X2XSCHEME
2020/03/10(火) 19:29:03.34ID:HIU8QCM9 でもまあ各翻訳単位に定義があれば結果的にインライン化しやすくはあるよな。
794デフォルトの名無しさん
2020/03/10(火) 21:03:29.37ID:tA89nuFe 今のinlineの効果は元のinlineの効果の必要条件
795デフォルトの名無しさん
2020/03/10(火) 22:56:08.25ID:y1k8c7Fe 788です。
私が作成しているプログラムではinlineに変えると逆に遅くなってしまったので元に戻しました。。
私が作成しているプログラムではinlineに変えると逆に遅くなってしまったので元に戻しました。。
796デフォルトの名無しさん
2020/03/11(水) 00:05:35.50ID:ECpQyQHt797はちみつ餃子 ◆8X2XSCHEME
2020/03/11(水) 00:22:12.50ID:FbH1Tm9+ >>796
正確なところは個別の場合を見てもらうしかないんだけど、
代表的な例としてたとえば erase なら削除したとこより後のイテレータは無効になるルール。
https://ja.cppreference.com/w/cpp/container/vector/erase
shrink_to_fit は再確保が発生したなら全て無効。
https://ja.cppreference.com/w/cpp/container/vector/shrink_to_fit
pop_back なら最後の要素と終端のイテレータが無効。
https://ja.cppreference.com/w/cpp/container/vector/pop_back
常識的な実装を考えればそりゃそうだろって感じで特に意外性はない。
正確なところは個別の場合を見てもらうしかないんだけど、
代表的な例としてたとえば erase なら削除したとこより後のイテレータは無効になるルール。
https://ja.cppreference.com/w/cpp/container/vector/erase
shrink_to_fit は再確保が発生したなら全て無効。
https://ja.cppreference.com/w/cpp/container/vector/shrink_to_fit
pop_back なら最後の要素と終端のイテレータが無効。
https://ja.cppreference.com/w/cpp/container/vector/pop_back
常識的な実装を考えればそりゃそうだろって感じで特に意外性はない。
798デフォルトの名無しさん
2020/03/11(水) 13:52:07.40ID:SPtGmxHY ……素朴に考えると範囲for文の中で削除してもよしなにやってくれそうな気はする
for(auto blt: enblts){
if( blt.isDead() ) enblts.erase(blt);
}
しかしこれはC++でもJava(remove)でも願い通りには動かない
でも弾幕ゲームをやってる初心者の直感では正しい
としたらこれから先の時代はフィルタで書いた方がいいのかもしれない
erase_if( enblts, [](Bullet blt){return blt.isDead();} );//c++, vector
enblts.remove_if( [](Bullet blt){return blt.isDead();} );//c++, list
enblts.removeIf( blt -> blt.isDead() );//java
enblts = filter( lambda blt: blt.isAlive(), enblts )#python
@enblts = grep{ $_->isAlive() } @enblts;#perl
for(auto blt: enblts){
if( blt.isDead() ) enblts.erase(blt);
}
しかしこれはC++でもJava(remove)でも願い通りには動かない
でも弾幕ゲームをやってる初心者の直感では正しい
としたらこれから先の時代はフィルタで書いた方がいいのかもしれない
erase_if( enblts, [](Bullet blt){return blt.isDead();} );//c++, vector
enblts.remove_if( [](Bullet blt){return blt.isDead();} );//c++, list
enblts.removeIf( blt -> blt.isDead() );//java
enblts = filter( lambda blt: blt.isAlive(), enblts )#python
@enblts = grep{ $_->isAlive() } @enblts;#perl
800デフォルトの名無しさん
2020/03/11(水) 17:00:24.04ID:U2q7VXWI801デフォルトの名無しさん
2020/03/11(水) 18:12:50.00ID:74rzlAzp802デフォルトの名無しさん
2020/03/11(水) 23:11:04.22ID:Z15vlJGb ↓こういう事って可能ですか?
class AClass
{
};
class BClass
{
public:
void Test();
};
int main ()
{
AClass a;
BClass b;
a += { &b, &BClass::Test }; //これを実現したい
}
class AClass
{
};
class BClass
{
public:
void Test();
};
int main ()
{
AClass a;
BClass b;
a += { &b, &BClass::Test }; //これを実現したい
}
803デフォルトの名無しさん
2020/03/11(水) 23:16:43.17ID:U9Axp26U >>801
ゲロ遅だけどな
ゲロ遅だけどな
804デフォルトの名無しさん
2020/03/11(水) 23:17:39.42ID:U9Axp26U >>802
何がしたいのかわからん
何がしたいのかわからん
805デフォルトの名無しさん
2020/03/11(水) 23:23:16.34ID:fq6QtVVC >>802
何をやりたいのかよくわからんがエスパーしてみると、メンバ関数ポインタやstd::function、演算子オーバーロードあたりを使えばいいのか
何をやりたいのかよくわからんがエスパーしてみると、メンバ関数ポインタやstd::function、演算子オーバーロードあたりを使えばいいのか
806デフォルトの名無しさん
2020/03/11(水) 23:36:37.62ID:74rzlAzp AClass::operator+=(std::initializer_list<void*>)でも実装すればいいのか?試してないけど
807デフォルトの名無しさん
2020/03/12(木) 00:07:14.34ID:dKrK1fwX {}で囲った物を、演算子やら関数なんかの引数として動くようにできるのか。言語仕様的に駄目なのかよくわからん。
ちなみに{}内の要素は異なる型が混在する。
C#のeventみたいな物を非マネージC++環境で作れないかと試している。
で、クラスメンバ関数の扱いで試行錯誤中。その他もろもろの実装はやれてるので、残りはこれだけ。
ちなみに{}内の要素は異なる型が混在する。
C#のeventみたいな物を非マネージC++環境で作れないかと試している。
で、クラスメンバ関数の扱いで試行錯誤中。その他もろもろの実装はやれてるので、残りはこれだけ。
808デフォルトの名無しさん
2020/03/12(木) 00:27:16.78ID:FwbIBGsL 関数テンプレートのテンプレート実引数推定時、引数に渡した{}は真っ先にinitializer_listとして推論されるので、異なる型を混在できない
引数をテンプレートじゃなくて、集成体とか普通のクラスにしとけば{}で渡せるけど、予め{}の中に入れられる型を固定しなければならない
引数をテンプレートじゃなくて、集成体とか普通のクラスにしとけば{}で渡せるけど、予め{}の中に入れられる型を固定しなければならない
809デフォルトの名無しさん
2020/03/12(木) 00:36:24.84ID:b+BTD4Kr こういうこと?
#include <iostream>
#include <vector>
#include <functional>
class AClass {
public:
void operator+=(std::function<void()> f) { handlers.push_back(f); }
void notify() { for (auto &f : handlers) f(); }
std::vector<std::function<void()>> handlers;
};
class BClass {
public:
void Test(){std::cout << __func__ << std::endl;}
};
int main () {
AClass a;
BClass b;
a += std::bind(&BClass::Test, &b);
a.notify();
}
#include <iostream>
#include <vector>
#include <functional>
class AClass {
public:
void operator+=(std::function<void()> f) { handlers.push_back(f); }
void notify() { for (auto &f : handlers) f(); }
std::vector<std::function<void()>> handlers;
};
class BClass {
public:
void Test(){std::cout << __func__ << std::endl;}
};
int main () {
AClass a;
BClass b;
a += std::bind(&BClass::Test, &b);
a.notify();
}
810デフォルトの名無しさん
2020/03/12(木) 01:57:39.17ID:dKrK1fwX >>809
一番初めに書いたけど、
a += { &b, &BClass::Test };
こういうすっきりした書き方ができないかと考えていたわけで。
std::function系はC#のeventで言う -= の挙動の実装が難なので、使っていません。
できないっぽいのでこの質問は終了とさせていただきます。
ご助言していただいた皆様ありがとうございました。
一番初めに書いたけど、
a += { &b, &BClass::Test };
こういうすっきりした書き方ができないかと考えていたわけで。
std::function系はC#のeventで言う -= の挙動の実装が難なので、使っていません。
できないっぽいのでこの質問は終了とさせていただきます。
ご助言していただいた皆様ありがとうございました。
811デフォルトの名無しさん
2020/03/12(木) 03:25:56.97ID:tyiaM2Xy c#ぽく書くのには限界あるよね
自分の場合は名前付きでstd::functionで持って
a.add("b",[&]{b.Test();})
みたいにしているな。
自分の場合は名前付きでstd::functionで持って
a.add("b",[&]{b.Test();})
みたいにしているな。
812デフォルトの名無しさん
2020/03/12(木) 12:41:33.69ID:yVQIWR3t EnumProcessModules でメインモジュール含め、全モジュールのベースアドレスとイメージサイズをゲットできると思うんですが
この範囲にないメモリ領域かつ、プロセスがコミットしてるメモリ領域って何が載っているんでしょうか?
検索していくと、MEM_COMMIT かつ PAGE_READWRITE かつ MEM_PRIVATE で、
プログラム中に書いた文字列がヒットするような領域もあるんですが
この範囲にないメモリ領域かつ、プロセスがコミットしてるメモリ領域って何が載っているんでしょうか?
検索していくと、MEM_COMMIT かつ PAGE_READWRITE かつ MEM_PRIVATE で、
プログラム中に書いた文字列がヒットするような領域もあるんですが
813デフォルトの名無しさん
2020/03/12(木) 13:29:56.54ID:jKEc330C >>803
リンクリストは速度的にはオールマイティーに近いデータ構造で、イテレートの速度も配列と同程度。
リンクリストは速度的にはオールマイティーに近いデータ構造で、イテレートの速度も配列と同程度。
814デフォルトの名無しさん
2020/03/12(木) 13:32:10.32ID:jKEc330C >>813
リンクリストが劇遅だと思っている人は、マシン語レベルでどういうコードになっているか分かって無いために、効率の良い使い方ができていないため。
正しく使えば、動的配列より平均速度もメモリ効率も速くなる確率が高いデータ構造。
リンクリストが劇遅だと思っている人は、マシン語レベルでどういうコードになっているか分かって無いために、効率の良い使い方ができていないため。
正しく使えば、動的配列より平均速度もメモリ効率も速くなる確率が高いデータ構造。
815810
2020/03/12(木) 15:24:18.59ID:dKrK1fwX 自己レスになりますが下記様なコードで最初の目的が達成できました。可変のコンストラクタ作っとくと{}の初期化の振り分けできるんですね。
template<class FUNC_TYPE>
class MetaFunction;
template<class ...ARG>
class MetaFunction<void(ARG...)>
{
public:
template<class ...INITARG>
MetaFunction(INITARG... arg) { Init(arg...); }
template<class T>
void Init(T* Instance, void(T::*proc)(ARG... arg))
{ //メンバ関数用の初期化
}
};
template<class FUNC_TYPE>
class EventHandler;
template<class ...ARG>
class EventHandler<void(ARG...)>
{
using META_FUNC = MetaFunction<void(ARG...)>;
public:
template<class T>
void Add(T* Instance, void (T::*proc)(ARG... arg))
{ //追加処理とか
}
inline EventHandler& operator+=(const META_FUNC& func)
{
this->Add(func);
return *this;
}
};
template<class FUNC_TYPE>
class MetaFunction;
template<class ...ARG>
class MetaFunction<void(ARG...)>
{
public:
template<class ...INITARG>
MetaFunction(INITARG... arg) { Init(arg...); }
template<class T>
void Init(T* Instance, void(T::*proc)(ARG... arg))
{ //メンバ関数用の初期化
}
};
template<class FUNC_TYPE>
class EventHandler;
template<class ...ARG>
class EventHandler<void(ARG...)>
{
using META_FUNC = MetaFunction<void(ARG...)>;
public:
template<class T>
void Add(T* Instance, void (T::*proc)(ARG... arg))
{ //追加処理とか
}
inline EventHandler& operator+=(const META_FUNC& func)
{
this->Add(func);
return *this;
}
};
816デフォルトの名無しさん
2020/03/12(木) 16:21:53.74ID:yVQIWR3t >>812
いろいろググってみましたが、分かったような分からんような…
とりあえず、MODULE_INFO.SizeOfImage は、読み込まれた Portable Executable のサイズを表してるっぽい?んでしょうか
コード命令が入ってる .text や、グローバル変数が入ってる .data 領域などいろいろ領域があってフォーマットが決まってるみたいだけど、
実行時のヒープやスタックとかは入ってないっていう認識で良いんでしょうか
PE のフォーマットググっても、exe をバイナリエディタで見たときのフォーマットは結構出てくるんですが、
メモリに載せた時のフォーマットって出てこないんですよね…、EXEをバイナリエディタで見た時と似たような感じだとは思うんですが多分まんまではないですよね
いろいろググってみましたが、分かったような分からんような…
とりあえず、MODULE_INFO.SizeOfImage は、読み込まれた Portable Executable のサイズを表してるっぽい?んでしょうか
コード命令が入ってる .text や、グローバル変数が入ってる .data 領域などいろいろ領域があってフォーマットが決まってるみたいだけど、
実行時のヒープやスタックとかは入ってないっていう認識で良いんでしょうか
PE のフォーマットググっても、exe をバイナリエディタで見たときのフォーマットは結構出てくるんですが、
メモリに載せた時のフォーマットって出てこないんですよね…、EXEをバイナリエディタで見た時と似たような感じだとは思うんですが多分まんまではないですよね
818デフォルトの名無しさん
2020/03/12(木) 17:45:34.82ID:5A3Kadll 遅いと思うとかじゃなくて実際にやった結果
listは激遅
dequeが1番良い
追加削除してもな
listは激遅
dequeが1番良い
追加削除してもな
819デフォルトの名無しさん
2020/03/12(木) 18:50:46.21ID:xw4q52xX >>812
C++関係ないからWin32APIスレとかで聞けばいいんでないの?
C++関係ないからWin32APIスレとかで聞けばいいんでないの?
820デフォルトの名無しさん
2020/03/12(木) 18:52:40.90ID:xw4q52xX >>813
リンクリストがオールマイティというのは、お前がリンクリスト使う処理しか書かないからというだけじゃね?
リンクリストがオールマイティというのは、お前がリンクリスト使う処理しか書かないからというだけじゃね?
821デフォルトの名無しさん
2020/03/12(木) 20:25:21.28ID:YvE3jgHm 天才の人でしょ
ほっとこ
ほっとこ
822デフォルトの名無しさん
2020/03/12(木) 20:30:58.97ID:9KLbHvc8 必死こいてリンクリスト宣伝して何になるんだろう
823デフォルトの名無しさん
2020/03/12(木) 20:40:10.69ID:yVQIWR3t824デフォルトの名無しさん
2020/03/12(木) 21:40:44.59ID:4MxR0DBA >>782
丁寧に説明していただいてありがとうございます!
丁寧に説明していただいてありがとうございます!
825デフォルトの名無しさん
2020/03/13(金) 03:26:23.39ID:BoiDYB4T ウヘン参照はどんなときに役立つんだ?
即値が代入出来るようになっただけか?
即値が代入出来るようになっただけか?
826デフォルトの名無しさん
2020/03/13(金) 07:01:46.94ID:8hjAly81 >>825
右辺値参照は右辺値(何もしないとその場で消えてなくなってしまうもの)をコピーを発生させずに捕まえておくことができる。
例:
>>782の
auto && __range = vec;
(正確にはauto&&はvecが左辺値の場合は通常の参照に、vecが右辺値の場合は右辺値参照になる)
他には関数のオーバーロードと組み合わせて引数が左辺値なのか右辺値なのかを区別して処理を振り分けることができる。
例:
void func(std::vector<int>& vec){ std::cout << "左辺値専用の処理" << std::endl; }
void func(std::vector<int>&& vec){ std::cout << "右辺値専用の処理" << std::endl; }
int main(){
std::vector<int> vec;
func(vec); // -> 左辺値専用の処理
func(std::vector<int>{1,2,3}); // -> 右辺値専用の処理
return 0;
}
右辺値参照は右辺値(何もしないとその場で消えてなくなってしまうもの)をコピーを発生させずに捕まえておくことができる。
例:
>>782の
auto && __range = vec;
(正確にはauto&&はvecが左辺値の場合は通常の参照に、vecが右辺値の場合は右辺値参照になる)
他には関数のオーバーロードと組み合わせて引数が左辺値なのか右辺値なのかを区別して処理を振り分けることができる。
例:
void func(std::vector<int>& vec){ std::cout << "左辺値専用の処理" << std::endl; }
void func(std::vector<int>&& vec){ std::cout << "右辺値専用の処理" << std::endl; }
int main(){
std::vector<int> vec;
func(vec); // -> 左辺値専用の処理
func(std::vector<int>{1,2,3}); // -> 右辺値専用の処理
return 0;
}
827はちみつ餃子 ◆8X2XSCHEME
2020/03/13(金) 09:59:34.43ID:o4vL6hq2 右辺値参照はほとんどムーブのための機能と言ってもいいかな。
左辺値か右辺値かを「区別」できることが重要であって、
参照の機能として特別なものがあるわけではない。
この区別が必要になったのはコピーの文脈かムーブの文脈かを知るため。
std::move が右辺値にキャストするだけということからも右辺値とムーブの関連性の強さが感じられる。
その上で右辺値参照と左辺値参照を自動で振り分ける参照 (ユニバーサル参照) を使えば
定義はひとつしか書いていないのに左辺値と右辺値の両方に対応できているなんてことも出来る。
ただし、右辺値参照は左辺値だということを忘れないように。
参照が左辺値参照か右辺値参照であるかを区別して再度振り分けなおすために std::forward がある。
左辺値か右辺値かを「区別」できることが重要であって、
参照の機能として特別なものがあるわけではない。
この区別が必要になったのはコピーの文脈かムーブの文脈かを知るため。
std::move が右辺値にキャストするだけということからも右辺値とムーブの関連性の強さが感じられる。
その上で右辺値参照と左辺値参照を自動で振り分ける参照 (ユニバーサル参照) を使えば
定義はひとつしか書いていないのに左辺値と右辺値の両方に対応できているなんてことも出来る。
ただし、右辺値参照は左辺値だということを忘れないように。
参照が左辺値参照か右辺値参照であるかを区別して再度振り分けなおすために std::forward がある。
828デフォルトの名無しさん
2020/03/13(金) 11:05:37.71ID:PLNbAfh2 auto&&は右辺値参照のくせに左辺値を束縛できるぞ
829デフォルトの名無しさん
2020/03/13(金) 12:25:06.20ID:0DRjOF6k ユニバーサルはテンプレートの文脈(なおかつTがテンプレート仮引数そのもの)
でなければ使えない
便利さばっか強調してると誤解招くぞ
でなければ使えない
便利さばっか強調してると誤解招くぞ
831デフォルトの名無しさん
2020/03/14(土) 06:54:36.59ID:rF6MWNax arithmeticとかpromotedってなんぞ
c++11以降のpow(int, int)の返り値はintなのですか?
c++11以降のpow(int, int)の返り値はintなのですか?
832デフォルトの名無しさん
2020/03/14(土) 09:56:19.78ID:LPZ7/QQq833はちみつ餃子 ◆8X2XSCHEME
2020/03/14(土) 15:29:27.33ID:7CRfyKLY >>831
候補として書いてある通りの型しかないよ。
https://ja.cppreference.com/w/cpp/numeric/math/pow
だけど、普通にオーバーロードしたら曖昧な状況が出来る場合があるだろ。
float foo(float x) { return x; }
double foo(double x) { return x; }
int main(void) {
foo(1); // どちらを呼び出せばいいのかわかんのでエラー。
return 0;
}
かといって int 版を追加、 long int 版、 long long int 版を追加……とかしていくのは面倒だなぁってことになるわけ。
それも二引数だったら全部の組み合わせが必要になってくる。
で、関数テンプレートで算術型ならなんでも受け取れるようにしておいて候補のどれかに振り分けるようにしようみたいな。
そういう感じ。
うまいこと振り分けなおす関数テンプレートがあるってだけ。
候補として書いてある通りの型しかないよ。
https://ja.cppreference.com/w/cpp/numeric/math/pow
だけど、普通にオーバーロードしたら曖昧な状況が出来る場合があるだろ。
float foo(float x) { return x; }
double foo(double x) { return x; }
int main(void) {
foo(1); // どちらを呼び出せばいいのかわかんのでエラー。
return 0;
}
かといって int 版を追加、 long int 版、 long long int 版を追加……とかしていくのは面倒だなぁってことになるわけ。
それも二引数だったら全部の組み合わせが必要になってくる。
で、関数テンプレートで算術型ならなんでも受け取れるようにしておいて候補のどれかに振り分けるようにしようみたいな。
そういう感じ。
うまいこと振り分けなおす関数テンプレートがあるってだけ。
834デフォルトの名無しさん
2020/03/14(土) 21:46:19.71ID:47FyzBVp c++のお勧め本教えて
初心者ではないけど、ここの話に付いていけるようにちゃんと学習したく。
初心者ではないけど、ここの話に付いていけるようにちゃんと学習したく。
835デフォルトの名無しさん
2020/03/14(土) 21:48:34.12ID:pvdkYWPZ とりあえずeffectve modern c++読んで
次は「ISO/IEC 14882:2017 Programming Languages -- C++」とかいう本を読むといいよ
次は「ISO/IEC 14882:2017 Programming Languages -- C++」とかいう本を読むといいよ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★3 [蚤の市★]
- 中国側が首相答弁の撤回要求、日本側拒否 [夜のけいちゃん★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 映画「鬼滅の刃」の興行収入急減、日本行き航空券大量キャンセル…中国メディア報道 [蚤の市★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 「タワマン天国」に飛びつく若者…SNSに転がる「成功体験」に続けるのか 湾岸エリアの業者が語った現実 [蚤の市★]
- 【悲報】高市効果で「1ドル=160円」が相場へwwwwwwwwwwwwwwwwwwwwwwwwwwwww 止まらぬ高市円安💥💥 [871926377]
- 小川彩佳アナ「高市総理はここまで影響が出ることを想像して発言したんでしょうか」高市ソルジャー「!!!!(シュババババ)」 [931948549]
- 【悲報】おこめ券、9.5億円配布分のうち2.4億が経費、うちJAが1億円中抜き🤗高市ありがとう [359965264]
- FGOで好きなサーヴァントがアビゲイル、北斎、楊貴妃なんだが
- 自閉症が「んなっしょい」と連呼するお🏡
- 【悲報】高市有事で日本に同調する国、1つも現れないwwwwwwwwwwwwwww [603416639]
