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:xvjipUWj714デフォルトの名無しさん
2020/03/06(金) 12:31:07.14ID:1NgZSMCO ダブルクォート含みのCSVとかをパースするための正規表現書く時とかいくらでもあるけど
raw文字列ってそういう時のための物じゃないの?
raw文字列ってそういう時のための物じゃないの?
715デフォルトの名無しさん
2020/03/06(金) 13:57:40.15ID:u9hNYNKX >>713
> トリプルクォートとRaw文字列は役割違うし別にとっちらかってないけど?
それこそお前の感想だよね?w
役割が違う言えば聞こえがいいが、pythonの文字列リテラルは機能の直行性もない短絡的な設計
rawは短い正規表現などの用途しか考えてなくて複数行でかつエスケープなしができない
でそういうのが欲しいケースはいくらでもある
JSONを文字列で埋め込んでおきたい場合とかね
c++のrawは建て増しなのは同じだけど設計の筋は通ってる
ただもう一歩がんばってindent合わせが可能な仕様にしてほしかったな
> トリプルクォートとRaw文字列は役割違うし別にとっちらかってないけど?
それこそお前の感想だよね?w
役割が違う言えば聞こえがいいが、pythonの文字列リテラルは機能の直行性もない短絡的な設計
rawは短い正規表現などの用途しか考えてなくて複数行でかつエスケープなしができない
でそういうのが欲しいケースはいくらでもある
JSONを文字列で埋め込んでおきたい場合とかね
c++のrawは建て増しなのは同じだけど設計の筋は通ってる
ただもう一歩がんばってindent合わせが可能な仕様にしてほしかったな
716デフォルトの名無しさん
2020/03/06(金) 13:59:12.86ID:ytQa5naT >Pythonなら R"ABC" "¥"" "def" ってやるだけ
rawの意味ねぇなww
rawの意味ねぇなww
717デフォルトの名無しさん
2020/03/06(金) 14:24:22.40ID:trP/ijr0718デフォルトの名無しさん
2020/03/06(金) 14:28:35.64ID:trP/ijr0 >>717
それから、本当に桁数の多い数の割り算計算が本質的に必要な場合は多倍長計算ライブラリを使えばいい。
多くのアプリではそういう状況が少ないと言うことだ。
科学技術計算では、doubleか、4倍精度float数を扱えればいいので、64BIT整数が必要な場面は今のところ少ない。
メッシュの個数やループ回数が32BITを超えるようなものは、今のCPUでは重過ぎて普通、計算できない。
それから、本当に桁数の多い数の割り算計算が本質的に必要な場合は多倍長計算ライブラリを使えばいい。
多くのアプリではそういう状況が少ないと言うことだ。
科学技術計算では、doubleか、4倍精度float数を扱えればいいので、64BIT整数が必要な場面は今のところ少ない。
メッシュの個数やループ回数が32BITを超えるようなものは、今のCPUでは重過ぎて普通、計算できない。
719デフォルトの名無しさん
2020/03/06(金) 14:38:19.40ID:2gPy1GFt720デフォルトの名無しさん
2020/03/06(金) 14:41:03.85ID:hYOq9QPM >>715
> rawは短い正規表現などの用途しか考えてなくて複数行でかつエスケープなしができない
まさかと思うがトリプルクォートとRaw文字列を組合せて使えることも知らんのか?
そんな知識で直行性とか語るなよw
> rawは短い正規表現などの用途しか考えてなくて複数行でかつエスケープなしができない
まさかと思うがトリプルクォートとRaw文字列を組合せて使えることも知らんのか?
そんな知識で直行性とか語るなよw
721デフォルトの名無しさん
2020/03/06(金) 14:45:21.47ID:hYOq9QPM722デフォルトの名無しさん
2020/03/06(金) 14:45:22.11ID:gkPkCuAw 業界全体の傾向では「printfへの回帰」が見られる
fmtはprintfの21世紀型強化版として捉える
つまり、+や<<で連結するのはどの言語でも煩わしかった
だからprintf(のようなもの)に戻ってきている
CUIやテキストへの出力はprintf程度で充分だった、と誰もが気付いた
fmtはprintfの21世紀型強化版として捉える
つまり、+や<<で連結するのはどの言語でも煩わしかった
だからprintf(のようなもの)に戻ってきている
CUIやテキストへの出力はprintf程度で充分だった、と誰もが気付いた
723デフォルトの名無しさん
2020/03/06(金) 14:45:35.04ID:2gPy1GFt 複数行できるぞ
std::cout << R"(abc)"
R"(def)"
"\nghi" << std::endl;
しかもエスケープあり/なしを途中で切り替えることまでできる
std::cout << R"(abc)"
R"(def)"
"\nghi" << std::endl;
しかもエスケープあり/なしを途中で切り替えることまでできる
724デフォルトの名無しさん
2020/03/06(金) 14:53:31.38ID:89RQTO1C 普通は16ビットあれば十分ですよ。
64ビット厨はプログラムしたことあるの?
64ビット厨はプログラムしたことあるの?
725デフォルトの名無しさん
2020/03/06(金) 15:11:10.95ID:/2BnMzJ+ ポインタ使えないだろ
726デフォルトの名無しさん
2020/03/06(金) 15:34:10.40ID:1NgZSMCO >>718
へー
お前の世界の普通の会計ソフトは43億円を扱えないし
お前の世界の普通の防犯カメラは43億ミリ秒(たった5日)連続稼働したら落ちるし
お前の世界の普通のOSは4GBのファイルを作れないのか
アホくさ
へー
お前の世界の普通の会計ソフトは43億円を扱えないし
お前の世界の普通の防犯カメラは43億ミリ秒(たった5日)連続稼働したら落ちるし
お前の世界の普通のOSは4GBのファイルを作れないのか
アホくさ
727デフォルトの名無しさん
2020/03/06(金) 15:56:44.11ID:trP/ijr0 >>726
16BIT時代から一兆円は扱えた。
Z80 はマシン語としては整数の掛け算/割り算も浮動小数点も全くサポートしてなかったが、BASIC言語ではどれも普通に出来た。
同様に、32BIT CPUでも、64BIT整数が扱えないわけではない。
16BIT時代から一兆円は扱えた。
Z80 はマシン語としては整数の掛け算/割り算も浮動小数点も全くサポートしてなかったが、BASIC言語ではどれも普通に出来た。
同様に、32BIT CPUでも、64BIT整数が扱えないわけではない。
728デフォルトの名無しさん
2020/03/06(金) 16:00:14.00ID:89RQTO1C intは16ビットが正解。
729デフォルトの名無しさん
2020/03/06(金) 16:03:04.34ID:u9hNYNKX730デフォルトの名無しさん
2020/03/06(金) 16:40:55.40ID:7d5kGJiP pythonは文字列まわりがとっちらかって結局2と3で分裂したが。
731デフォルトの名無しさん
2020/03/06(金) 17:14:18.31ID:1NgZSMCO python2で混乱してたのはraw周りじゃないぞ
文字列の文法は3でもほとんど変わってないはず
strとunicodeとbyte(に相当するもの)の扱いがナイーブ過ぎてグッチャグチャだったのがpython2の大問題
文字列の文法は3でもほとんど変わってないはず
strとunicodeとbyte(に相当するもの)の扱いがナイーブ過ぎてグッチャグチャだったのがpython2の大問題
732デフォルトの名無しさん
2020/03/06(金) 18:10:29.44ID:k+5uYmSv >>729
pythonでも"と'を同時に使わない限り何でもかけるじゃん。
一方、c++は)"という並びを文字列中にかけない制限があるわけなんで、
もちろん後者のほうか確率は低いけど、pythonを一方的に機能不全と言えるほどじゃないなー
pythonでも"と'を同時に使わない限り何でもかけるじゃん。
一方、c++は)"という並びを文字列中にかけない制限があるわけなんで、
もちろん後者のほうか確率は低いけど、pythonを一方的に機能不全と言えるほどじゃないなー
733デフォルトの名無しさん
2020/03/06(金) 18:15:02.80ID:2gPy1GFt734デフォルトの名無しさん
2020/03/06(金) 18:26:07.10ID:k+5uYmSv >>733
回線切って吊ってくる
回線切って吊ってくる
>>718
>多倍長計算ライブラリ
GMP が有名どころではありますが、GPL なのが嫌ですね
そういう人のために、かなり遅いのですけれども https://mevius.5ch.net/test/read.cgi/tech/1434079972/51 を公開していますので、よろしければ使ってください
>多倍長計算ライブラリ
GMP が有名どころではありますが、GPL なのが嫌ですね
そういう人のために、かなり遅いのですけれども https://mevius.5ch.net/test/read.cgi/tech/1434079972/51 を公開していますので、よろしければ使ってください
736デフォルトの名無しさん
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
リンクリストは速度的にはオールマイティーに近いデータ構造で、イテレートの速度も配列と同程度。
リンクリストは速度的にはオールマイティーに近いデータ構造で、イテレートの速度も配列と同程度。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否 [夜のけいちゃん★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 [蚤の市★]
- 映画「鬼滅の刃」の興行収入急減、日本行き航空券大量キャンセル…中国メディア報道 [蚤の市★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★5 [ぐれ★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 【大分】佐賀関で大規模火災、170棟以上が延焼中 70代男性1人と連絡取れず [ぐれ★]
- 【悲報】中国営業に熱心な日本人タレントたち、中国のイベントが続々と中止に… まだ予定中のアイドルとか歌手とかたくさんいるけど [452836546]
- 麻生太郎氏、高市政権と距離を置きはじめる(´・ω・`) [399259198]
- 自閉症が「んなっしょい」と連呼するお🏡
- 【悲報】SP500今日も暴落で完全に世界恐慌。高市恐慌として全世界で語り継がれそう [686538148]
- トヨタ、反日だった。2027年に中国にレクサスのEV工場を設立。高市 [931948549]
- 【悲報】高市効果で「1ドル=160円」が相場へwwwwwwwwwwwwwwwwwwwwwwwwwwwww 止まらぬ高市円安💥💥 [871926377]
