前スレ
C++相談室 part157
https://mevius.5ch.net/test/read.cgi/tech/1628474251/
C++相談室 part158
■ このスレッドは過去ログ倉庫に格納されています
2021/11/15(月) 18:49:18.44ID:I69rZ/Of
242デフォルトの名無しさん
2021/12/07(火) 00:15:41.50ID:35fMaRJu >>219
今から考えれば NECのPC-8801 のBASIC言語は数学好きに合っていた。
当時のNECの社長は、東大物理の大学院出の人だったらしい。
その人がTOPにいる間はNECのパソコンは日本で一斉を風靡していたが、
その人が降りてからは、嘘の様に勢いがなくなった。
今から考えれば NECのPC-8801 のBASIC言語は数学好きに合っていた。
当時のNECの社長は、東大物理の大学院出の人だったらしい。
その人がTOPにいる間はNECのパソコンは日本で一斉を風靡していたが、
その人が降りてからは、嘘の様に勢いがなくなった。
243デフォルトの名無しさん
2021/12/07(火) 13:20:30.29ID:XtC4oDEh みんなコルーチン使ってる?
244デフォルトの名無しさん
2021/12/07(火) 13:44:30.14ID:bN2QwYhk コルーチンはいろいろ制限が多くてな、最近はfiberの方を使ってる
機種依存APIを使う必要がある、実行効率が若干落ちる、スタック用のメモリを大量消費する、トレースデバッグがやりづらい等のデメリットはあるが、
本物のyieldはやっぱ便利よ
機種依存APIを使う必要がある、実行効率が若干落ちる、スタック用のメモリを大量消費する、トレースデバッグがやりづらい等のデメリットはあるが、
本物のyieldはやっぱ便利よ
245デフォルトの名無しさん
2021/12/07(火) 14:37:49.13ID:RTlriAYU c+のvectorって無限に要素追加したらどうなりますか?
例えばwhile (1) でemplace_back()し続けた時の挙動です。javaみたいにちゃんとoutofmemoryエラー吐くようにできてますか?
例えばwhile (1) でemplace_back()し続けた時の挙動です。javaみたいにちゃんとoutofmemoryエラー吐くようにできてますか?
246デフォルトの名無しさん
2021/12/07(火) 14:52:13.72ID:N5mK0FmF 「ちゃんとout of memoryエラーを吐く」というのは突き詰めるとものすごく難しい概念なので、どこまでを求めるかによる
Javaにしても本当にどのレベルまで正しくやれてるのかは知らん
まあ「なんかあったらstd::bad_alloc投げて来るやろ」で99%のケースは事足りると思うけど
Javaにしても本当にどのレベルまで正しくやれてるのかは知らん
まあ「なんかあったらstd::bad_alloc投げて来るやろ」で99%のケースは事足りると思うけど
247デフォルトの名無しさん
2021/12/07(火) 14:57:50.91ID:xk7e4Rn1 例えば普通のアプリだと、C++とか関係なく最近のOSのメモリ確保は仮想メモリの確保なので、実際にそのアドレスが使われて初めて物理アドレスが確保され、スワップ領域が足りない場合もそのとき検出される。
248デフォルトの名無しさん
2021/12/07(火) 14:57:56.04ID:Z6YBtzSC mallocに失敗すればbad_allocが投げられるが
実際のところmallocが失敗するときにできることは殆ど無いと認識している
実際のところmallocが失敗するときにできることは殆ど無いと認識している
249デフォルトの名無しさん
2021/12/07(火) 15:01:16.11ID:i9OSA5UU >>179
そもそも C++ から Fortran で書かれてるオリジナルの BLAS とか LAPACK を呼ぶこともできるのだから、その辺は別に何でも良い
そんなことよりも多次元配列をどう持つかの方が C++ にとっては難しい課題だ
Cの多次元配列や一次元配列として持つのはユーザ側の負担が大き過ぎる
boost の multi_array は放置されている (move セマンティクスに対応してすらない)
xtensor みたいなサードパーティのものをわざわざ使うのも…… (つーかどれもパッとしない)
早く多次元配列くらい公式で用意してほしい
そもそも C++ から Fortran で書かれてるオリジナルの BLAS とか LAPACK を呼ぶこともできるのだから、その辺は別に何でも良い
そんなことよりも多次元配列をどう持つかの方が C++ にとっては難しい課題だ
Cの多次元配列や一次元配列として持つのはユーザ側の負担が大き過ぎる
boost の multi_array は放置されている (move セマンティクスに対応してすらない)
xtensor みたいなサードパーティのものをわざわざ使うのも…… (つーかどれもパッとしない)
早く多次元配列くらい公式で用意してほしい
250デフォルトの名無しさん
2021/12/07(火) 15:42:17.22ID:bN4twrqH 多次元といっても中身掛け算の一次元だしな
251デフォルトの名無しさん
2021/12/07(火) 16:20:01.36ID:m1NjLpbT class foo : vector<mystruct>
みたいなクラスを作っているんだけど
クラス内の関数で自身の配列の構造体の関数を呼ぶにはどうしたらいいんだろう?
this[a]->set(0);
と書いてもメンバーがありませんと出て困ってます😭
みたいなクラスを作っているんだけど
クラス内の関数で自身の配列の構造体の関数を呼ぶにはどうしたらいいんだろう?
this[a]->set(0);
と書いてもメンバーがありませんと出て困ってます😭
252デフォルトの名無しさん
2021/12/07(火) 16:24:10.42ID:bN4twrqH (*this)[a]->set(0);
253デフォルトの名無しさん
2021/12/07(火) 16:32:15.84ID:m1NjLpbT254デフォルトの名無しさん
2021/12/07(火) 17:48:46.48ID:D9y2bkeI そういうときはat()使ってる
255デフォルトの名無しさん
2021/12/07(火) 18:03:51.96ID:bN4twrqH atは範囲チェック分鈍くなるの我慢出来るなら有
あと例外飛ばすからtry〜catch節必須
あと例外飛ばすからtry〜catch節必須
256デフォルトの名無しさん
2021/12/07(火) 20:03:22.82ID:CgArR1cc257デフォルトの名無しさん
2021/12/07(火) 21:29:05.30ID:C8BO015l std::vectorのデストラクタはvirtualじゃないから気を付けてね、念のため
258デフォルトの名無しさん
2021/12/07(火) 22:45:19.35ID:eXh2WItM abort()したら生きている自動オブジェクトは
どうなってし
まいますの?
どうなってし
まいますの?
259デフォルトの名無しさん
2021/12/08(水) 00:17:43.36ID:19ueGHR5 #include <iostream>
#include <cstdlib>
using namespace std;
struct s {
~s() {cout << "called." << endl;}
};
int main() {
s a;
abort();
return 0;
}
https://ideone.com/YDdO5O
https://cpprefjp.github.io/reference/cstdlib/abort.html
#include <cstdlib>
using namespace std;
struct s {
~s() {cout << "called." << endl;}
};
int main() {
s a;
abort();
return 0;
}
https://ideone.com/YDdO5O
https://cpprefjp.github.io/reference/cstdlib/abort.html
260デフォルトの名無しさん
2021/12/08(水) 00:51:11.41ID:x9fXkANc abortより例外飛ばした方が確実だな(VC++6.0を除く
261デフォルトの名無しさん
2021/12/08(水) 07:27:41.53ID:HL2646/9262デフォルトの名無しさん
2021/12/08(水) 07:58:51.26ID:ZH5V4J5Q 多次元配列 (mdspanだっけ) ってまだSTLに入らんの?
線形代数アルゴリズムはBLAS、LAPACKはじめ外部のライブラリに頼らざるを得ないんだから、最小限の機能だけ備えた取り回しの良いライブラリをさっさと入れちゃえば良いのに
この機械学習全盛の時代に置いてかれるよね
線形代数アルゴリズムはBLAS、LAPACKはじめ外部のライブラリに頼らざるを得ないんだから、最小限の機能だけ備えた取り回しの良いライブラリをさっさと入れちゃえば良いのに
この機械学習全盛の時代に置いてかれるよね
263デフォルトの名無しさん
2021/12/08(水) 10:00:58.02ID:19ueGHR5 機械学習全盛なの?
264デフォルトの名無しさん
2021/12/08(水) 13:49:53.98ID:juXg17Zg ああいうライブラリってプラットフォームにべったり依存してるんじゃないの
265デフォルトの名無しさん
2021/12/08(水) 13:51:20.15ID:ADK1Cn8m GoogleのGPUがオンラインで無料でつかえるぞ
Python言語だが
Python言語だが
266デフォルトの名無しさん
2021/12/08(水) 13:56:11.42ID:ADK1Cn8m C言語とかローカルの言語からGoogleのGPUを操作できれば
ローカルで実行してるのと大差なくできると今おもったが
探せばすでにそういったAPIとかある気はしたが
ローカルで実行してるのと大差なくできると今おもったが
探せばすでにそういったAPIとかある気はしたが
267デフォルトの名無しさん
2021/12/08(水) 14:21:17.05ID:19ueGHR5 スレ違い。
Google Colaboratoryはjupyter notebook使えればいいだけ。
!や%%で大抵のことは出来る。
Google Colaboratoryはjupyter notebook使えればいいだけ。
!や%%で大抵のことは出来る。
268デフォルトの名無しさん
2021/12/08(水) 16:19:48.22ID:ZH5V4J5Q >>264
どういうライブラリ?
どういうライブラリ?
269デフォルトの名無しさん
2021/12/09(木) 00:00:00.18ID:y//gPIop >>260
例外飛ばしたら今度はCの関数が処理の途中でぶっちされるやん……?
次のような場合:
foo() // C++で記述、例外をスロー
↑
bar() // Cで記述、ループ内とかでfoo()を呼ぶ
↑
baz() // C/C++で書かれた呼び出し元
例外飛ばしたら今度はCの関数が処理の途中でぶっちされるやん……?
次のような場合:
foo() // C++で記述、例外をスロー
↑
bar() // Cで記述、ループ内とかでfoo()を呼ぶ
↑
baz() // C/C++で書かれた呼び出し元
270デフォルトの名無しさん
2021/12/09(木) 01:16:56.11ID:nwscR4Pq 構造体を関数の中で宣言して戻り値に入れたら
呼び出した側が受け取った値はどこかで開放しないといけないですか?
呼び出した側が受け取った値はどこかで開放しないといけないですか?
271デフォルトの名無しさん
2021/12/09(木) 01:43:46.28ID:9kW8IukA272デフォルトの名無しさん
2021/12/09(木) 07:16:10.87ID:Gl3ymjyg273デフォルトの名無しさん
2021/12/09(木) 09:45:40.72ID:nwscR4Pq274はちみつ餃子 ◆8X2XSCHEME
2021/12/09(木) 10:43:53.70ID:XwSSuf4e そこらへんのメカニズムはどんな入門書にでも書いてあるはずだよ。
C# の経験があると C++ の入門書では重複する考え方も多くて馬鹿らしく思うかもしれないけど、
似て非なる機能や用語で混乱しないためには基礎から学んだほうがいい。
C# の経験があると C++ の入門書では重複する考え方も多くて馬鹿らしく思うかもしれないけど、
似て非なる機能や用語で混乱しないためには基礎から学んだほうがいい。
275デフォルトの名無しさん
2021/12/09(木) 11:33:51.67ID:WBF8gVdC newを知っててもdelete知らなかったりするからな
276デフォルトの名無しさん
2021/12/09(木) 11:45:45.22ID:kWV4UehO そこらじゅうにうんこをばらまいておいて誰かが始末してくれると信じているというわけか
277デフォルトの名無しさん
2021/12/09(木) 12:14:01.37ID:WBF8gVdC やつらメモリーリークという言葉自体知らなかったりするから
278デフォルトの名無しさん
2021/12/09(木) 17:58:28.95ID:0JFBEVvg GC言語でもファイルのcloseはあるから
C++はメモリもあれと同じでnewした物は全部責任持ってdeleteしなきゃならないんだよって教えるんだけど
みんなこの世の終わりみたいな顔する
C++はメモリもあれと同じでnewした物は全部責任持ってdeleteしなきゃならないんだよって教えるんだけど
みんなこの世の終わりみたいな顔する
279デフォルトの名無しさん
2021/12/09(木) 18:13:01.83ID:jWh05eno >>275
w
w
280デフォルトの名無しさん
2021/12/09(木) 20:34:39.79ID:XclkFwFR おまいら「よう、うんこ掃除屋」
unique_ptr「…」
10年後、人類はAIの反乱で滅亡するのでした
unique_ptr「…」
10年後、人類はAIの反乱で滅亡するのでした
281デフォルトの名無しさん
2021/12/09(木) 21:19:33.80ID:JHQQMY8Y コンピューターの計算だから正しいっ!!
282デフォルトの名無しさん
2021/12/09(木) 23:56:02.90ID:y//gPIop283デフォルトの名無しさん
2021/12/09(木) 23:59:22.21ID:9kW8IukA >>282
Cで書かれてるならデストラクタなどはないのでメモリ解放で破棄
Cで書かれてるならデストラクタなどはないのでメモリ解放で破棄
284デフォルトの名無しさん
2021/12/09(木) 23:59:43.06ID:y//gPIop Cの構造体はunwindされずただぶっちされるだけ
コードの実行がぶっちされるのはC/C++共通う
コードの実行がぶっちされるのはC/C++共通う
285デフォルトの名無しさん
2021/12/10(金) 00:07:01.17ID:4mUmJ7za 自身を適切に開放なり後始末なりするデストラクタを持たないオブジェクトは例外でほぼ等しく致命傷を負う
そういうデストラクタを持っているつもりでも、コードの実行順がぶっちされることにより、
プログラマーの不注意ですぐ致命傷を負う
そういうデストラクタを持っているつもりでも、コードの実行順がぶっちされることにより、
プログラマーの不注意ですぐ致命傷を負う
286デフォルトの名無しさん
2021/12/10(金) 00:28:44.05ID:G7csYfUf cat >sample_cpp.cpp <<EOF
#include <iostream>
using namespace std;
struct s {
~s() {cout << "called." << endl;}
};
void func1() {
s a;
throw "hoge";
}
extern "C" void func2(void(*)());
int main() {
s a;
try {
func2(func1);
}
catch(const char* m) {
cout << m << endl;
}
return 0;
}
EOF
cat >sample_c.c <<EOF
struct s {
int dummy;
};
void func2(void (*f)()) {
struct s a;
f();
}
EOF
#include <iostream>
using namespace std;
struct s {
~s() {cout << "called." << endl;}
};
void func1() {
s a;
throw "hoge";
}
extern "C" void func2(void(*)());
int main() {
s a;
try {
func2(func1);
}
catch(const char* m) {
cout << m << endl;
}
return 0;
}
EOF
cat >sample_c.c <<EOF
struct s {
int dummy;
};
void func2(void (*f)()) {
struct s a;
f();
}
EOF
287デフォルトの名無しさん
2021/12/10(金) 00:29:59.22ID:G7csYfUf gcc -g -c sample_c.c
g++ -Wall -g -c sample_cpp.cpp
g++ sample_c.o sample_cpp.o -o sample
./sample
実行結果
called.
hoge
called.
>>284-285
Cにはデストラクタがないので、メモリが開放されればOKであり、自動的に開放される
C++ではスコープから外れればデストラクタが呼ばれた後にメモリが開放される
g++ -Wall -g -c sample_cpp.cpp
g++ sample_c.o sample_cpp.o -o sample
./sample
実行結果
called.
hoge
called.
>>284-285
Cにはデストラクタがないので、メモリが開放されればOKであり、自動的に開放される
C++ではスコープから外れればデストラクタが呼ばれた後にメモリが開放される
288はちみつ餃子 ◆8X2XSCHEME
2021/12/10(金) 01:18:14.66ID:ogq0Brkp JavaScript でリソースを解放 (GC で回収) するために
変数に false を代入して参照を切っているのを見たことが有って、
GC があってもこの手のバッドノウハウは要るんだなと思いました。 (小並感)
変数に false を代入して参照を切っているのを見たことが有って、
GC があってもこの手のバッドノウハウは要るんだなと思いました。 (小並感)
289デフォルトの名無しさん
2021/12/10(金) 01:52:31.83ID:eLt0CNh3 GCが正常に機能しているという保証がそもそもないから
そもそも何が正常な動作なのかを誰も責任とらない架空の権威によって成り立っている
そもそも何が正常な動作なのかを誰も責任とらない架空の権威によって成り立っている
290はちみつ餃子 ◆8X2XSCHEME
2021/12/10(金) 01:58:44.76ID:ogq0Brkp メモリ回収のタイミングが保証されないのは大した問題ではない
(プロセスが終了すればどうせ回収されるので)
のだが、外部のリソースを掴んでいるときに後始末されないかもしれないのは困るな。
(プロセスが終了すればどうせ回収されるので)
のだが、外部のリソースを掴んでいるときに後始末されないかもしれないのは困るな。
291デフォルトの名無しさん
2021/12/10(金) 02:33:47.50ID:eLt0CNh3 Windows10でコマンドプロンプトのGUIを提供するconhost.exeはナウくてヤングなC++のstd::basic_string_viewを使っている
Windows2000以来のconhost.exeが古いコードのままメンテ放置されているわけではないことがわかり少しだけほっこりする
以下、それらしきシンボル
TextBuffer::InsertCharacter(class std::basic_string_view<unsigned short,struct std::char_traits<unsigned short> >,class DbcsAttribute,class TextAttribute)
ま、本当はなにをしたかったというとpwsh.exeとconhost.exeが道連れクラッシュして困ってるってだけなんだが
Windows2000以来のconhost.exeが古いコードのままメンテ放置されているわけではないことがわかり少しだけほっこりする
以下、それらしきシンボル
TextBuffer::InsertCharacter(class std::basic_string_view<unsigned short,struct std::char_traits<unsigned short> >,class DbcsAttribute,class TextAttribute)
ま、本当はなにをしたかったというとpwsh.exeとconhost.exeが道連れクラッシュして困ってるってだけなんだが
292デフォルトの名無しさん
2021/12/10(金) 05:50:56.28ID:iiZD81ri 多人数のプロジェクトほどuniqueではなくshard_ptrが増えるのはトラブった時に誰も責任取らなくていいからって事?
293デフォルトの名無しさん
2021/12/10(金) 07:04:02.57ID:eLt0CNh3 shared_ptrを乱用する職業PGよりもweak_ptrを使いこなせる厨二PGたれ
主従関係がある場合、主が従のシェアポを持ち、従が主のウイポを持て
主従関係がある場合、主が従のシェアポを持ち、従が主のウイポを持て
294デフォルトの名無しさん
2021/12/10(金) 07:11:56.68ID:eLt0CNh3 多くの職業PGは依存関係を親子関係で騙りたがるが、
生物学上、親は子より先に生まれ先に死ぬのだから、FIFOは成り立つがLIFOは成り立たない
ポリコレ的にはマスター/スレーブではなくプライマリ/セカンダリが望ましいとされる
ルー語の乱用をさけるならばプライマリ/セカンダリではなく主/従がなお良い
よって依存関係を主従関係で騙るのが正しい
織豊政権のように、主君の死後に従者が取って代わった例もあるから完全ではないが
生物学上、親は子より先に生まれ先に死ぬのだから、FIFOは成り立つがLIFOは成り立たない
ポリコレ的にはマスター/スレーブではなくプライマリ/セカンダリが望ましいとされる
ルー語の乱用をさけるならばプライマリ/セカンダリではなく主/従がなお良い
よって依存関係を主従関係で騙るのが正しい
織豊政権のように、主君の死後に従者が取って代わった例もあるから完全ではないが
295デフォルトの名無しさん
2021/12/10(金) 07:15:52.21ID:eLt0CNh3 秀吉は主君信長のweak_ptrを持っていたので本能寺の変での主君の横死を的確に知ることができた
296デフォルトの名無しさん
2021/12/10(金) 07:35:10.03ID:WKa1d5RR くだらねえ
喩え話なのはみんなわかってんのに
覚えたての日本語ひけらかしてドヤるな
喩え話なのはみんなわかってんのに
覚えたての日本語ひけらかしてドヤるな
297デフォルトの名無しさん
2021/12/10(金) 08:04:47.84ID:eLt0CNh3 ルー語の乱用を避けるのが礼儀だぞ
298デフォルトの名無しさん
2021/12/10(金) 08:16:32.12ID:Qqc0ky4z >>290
そうなんだよね
リソース解放のタイミングが保証されないのは言語設計のミスだった
JavaではファイルやソケットなどのリソースはGCのときに呼ばれるfinalizeで解放すればいいよって思想だったけど
いつfinalizeが呼ばれるのか予測できないことに起因するバグが多発
ついにfinalizeが廃止されることになった
リソースは自前で廃棄してねというスタンス
GCも当初の期待ほどうまくいってない
そうなんだよね
リソース解放のタイミングが保証されないのは言語設計のミスだった
JavaではファイルやソケットなどのリソースはGCのときに呼ばれるfinalizeで解放すればいいよって思想だったけど
いつfinalizeが呼ばれるのか予測できないことに起因するバグが多発
ついにfinalizeが廃止されることになった
リソースは自前で廃棄してねというスタンス
GCも当初の期待ほどうまくいってない
299デフォルトの名無しさん
2021/12/10(金) 09:48:13.03ID:IPFkCC9z ファイルやソケットの開放はcloseないしデストラクタでやるのだから保証されてるぞ?
保証されないのはメモリリソースだけ
あとjavaも当初からfinalizeが呼ばれることは保証されてなかったからfinalizeで開放しなさいなんていう慣習はなかったと思うが
保証されないのはメモリリソースだけ
あとjavaも当初からfinalizeが呼ばれることは保証されてなかったからfinalizeで開放しなさいなんていう慣習はなかったと思うが
300デフォルトの名無しさん
2021/12/10(金) 10:14:08.92ID:eLt0CNh3 JavaはJDBC周りのGCの挙動が厄介だYO
GC性善説に立つと痛い目にあう
GC性善説に立つと痛い目にあう
301デフォルトの名無しさん
2021/12/10(金) 11:20:58.79ID:Qqc0ky4z >>299
JavaやC#にはデストラクタないからね
C++経験者がJavaやC#ではファイナライザーを使ったりしてたんだよ
C#ではマイクロソフト謹製標準ライブラリでさえファイナライザーでファイルを閉じるクソコードがある
JavaやC#にはデストラクタないからね
C++経験者がJavaやC#ではファイナライザーを使ったりしてたんだよ
C#ではマイクロソフト謹製標準ライブラリでさえファイナライザーでファイルを閉じるクソコードがある
302デフォルトの名無しさん
2021/12/10(金) 11:32:06.75ID:G7csYfUf いつまでスレ違いの話続けんの?間違いの指摘すら面倒
303デフォルトの名無しさん
2021/12/10(金) 11:49:22.35ID:/d3oGHTa C#はファイナライザで解放でいいんだよ
Disposeパターンがそういうスタイルだから
Disposeパターンがそういうスタイルだから
304デフォルトの名無しさん
2021/12/10(金) 11:51:44.78ID:IPFkCC9z >>301
それはその個人が不勉強なだけだろ…
finalizeが呼ばれないことがあるのはあまりに初歩的なチップスで、初級でない一般的なJavaプログラマがfinalizeだけでリソース開放するとかありえない。
思想って誰の思想?
メモリ解放に気を使わないC/C++プログラマがいないのと同じ
それはその個人が不勉強なだけだろ…
finalizeが呼ばれないことがあるのはあまりに初歩的なチップスで、初級でない一般的なJavaプログラマがfinalizeだけでリソース開放するとかありえない。
思想って誰の思想?
メモリ解放に気を使わないC/C++プログラマがいないのと同じ
305デフォルトの名無しさん
2021/12/10(金) 12:27:48.66ID:Qqc0ky4z306デフォルトの名無しさん
2021/12/10(金) 12:36:42.08ID:WKa1d5RR C++の轍を踏まないはずが
ざまあねえな
ざまあねえな
307デフォルトの名無しさん
2021/12/10(金) 12:43:00.40ID:iN+TjAqi308デフォルトの名無しさん
2021/12/10(金) 16:09:36.14ID:nNdO4jXs vectorのaが空じゃないと思い込んでて実は空の状態で
for (int i =0; i < a.size()-1; i++)
これやると一瞬でオワるのなんとかならないかな
まあ普通はa.sizeをintやらでキャスりましょーって話だとは思うけど
そもそもsizeの型がuなのが悪いと思うんだが
uじゃなきゃ足りないくらいの要素数確保することなんてあんのか?ぁん?
for (int i =0; i < a.size()-1; i++)
これやると一瞬でオワるのなんとかならないかな
まあ普通はa.sizeをintやらでキャスりましょーって話だとは思うけど
そもそもsizeの型がuなのが悪いと思うんだが
uじゃなきゃ足りないくらいの要素数確保することなんてあんのか?ぁん?
309デフォルトの名無しさん
2021/12/10(金) 16:21:05.76ID:UbGkGPEB i+1<a.size()
310デフォルトの名無しさん
2021/12/10(金) 16:24:59.62ID:4aSHek6G または、if(!a.empty()) for(...)
311デフォルトの名無しさん
2021/12/10(金) 16:26:11.66ID:nNdO4jXs >>309
てんさいかよ
てんさいかよ
312デフォルトの名無しさん
2021/12/10(金) 16:40:04.25ID:UbGkGPEB C++20にはstd::ssize()もあるぞ
313デフォルトの名無しさん
2021/12/10(金) 16:46:05.19ID:PJTDipJe i <= a.size()-1じゃなくて i < a.size()-1?
314デフォルトの名無しさん
2021/12/10(金) 16:54:00.86ID:eLt0CNh3 以下のような直感的でベタな条件式のほうがいいと思うよ
for (int i =0; a.size() > 0 && i < a.size()-1; i++)
for (int i =0; a.size() > 0 && i < a.size()-1; i++)
315デフォルトの名無しさん
2021/12/10(金) 16:56:40.50ID:eLt0CNh3 一見すると小学生の書いた作文っぽく見えるコードが結局のところ一番良い
厨二を拗らせたような難解なコードは避けよう
厨二を拗らせたような難解なコードは避けよう
316デフォルトの名無しさん
2021/12/10(金) 16:58:49.17ID:UbGkGPEB このループ内でa[i]とa[i+1]を使ってなんかするんだろ
a[i+1]が有効なインデックスか?という条件がi+1<a.size()でこれは自然
a[i+1]が有効なインデックスか?という条件がi+1<a.size()でこれは自然
317デフォルトの名無しさん
2021/12/10(金) 17:19:52.62ID:PJTDipJe ああ、それなら納得
318デフォルトの名無しさん
2021/12/10(金) 17:20:02.15ID:qnyfSMbx なんで-1してるの?
319デフォルトの名無しさん
2021/12/10(金) 18:23:30.43ID:31VztrOJ 出典忘れたけどsizeが符号無しなのは標準委員会も失敗だったと考えてるらしい(?)
320デフォルトの名無しさん
2021/12/10(金) 20:12:16.24ID:AEk60g9j まあ、そうでなきゃssize_tなんて恥ずかしいもの後付けしたりしないし
321デフォルトの名無しさん
2021/12/10(金) 20:26:39.77ID:4aSHek6G >>314
二回余計な比較にクロックを喰われる
二回余計な比較にクロックを喰われる
322デフォルトの名無しさん
2021/12/10(金) 21:01:58.48ID:G7csYfUf 最近このスレやばない?
intじゃなくてstd::vector<...>::size_typeでいい
>>310は明らかに間違ってる
1引くケースは大抵サイズ2以上がよくある事前条件なので普通事前に弾く
ループ内や別スレッドでvectorが変更されないケースならループの外で1引いた方が速い
今回ssize_tは無関係
intじゃなくてstd::vector<...>::size_typeでいい
>>310は明らかに間違ってる
1引くケースは大抵サイズ2以上がよくある事前条件なので普通事前に弾く
ループ内や別スレッドでvectorが変更されないケースならループの外で1引いた方が速い
今回ssize_tは無関係
323デフォルトの名無しさん
2021/12/10(金) 21:13:20.54ID:4aSHek6G324デフォルトの名無しさん
2021/12/10(金) 21:27:52.13ID:G7csYfUf325デフォルトの名無しさん
2021/12/10(金) 21:33:24.42ID:4aSHek6G326デフォルトの名無しさん
2021/12/10(金) 22:00:02.92ID:G7csYfUf >>325
聞かれたから答えたけど会話にならんな・・・この辺で
聞かれたから答えたけど会話にならんな・・・この辺で
327デフォルトの名無しさん
2021/12/10(金) 22:00:16.81ID:caXqow3a どうしたらいいかご意見を聞かせてください!٩( ᐛ )و
class hogeにおいてメンバ変数unique_ptr<toge>toge1を所有しております。
vector<hoge> vHogeを運用するとき、hogeのインスタンスをプッシュバックしようとすると、削除された関数ですというエラーメッセージが帰ってまいります。
おそらくtoge1がユニークポインタであり、ムーブ以外の移動が不可能だからだと思うのですが……このままプッシュバックさせるのに何か方法はありますでしょうか?
健作でtoge1にshared_ptrを使う、hogeのコピーコンストラクタにmemcpyを使う等の解を見つけました。
私ごとですが、shared_ptrは循環参照で失敗した哀しい過去があり、恐怖感があります。
またmemcpyでユニークポインタをメモリコピーする場合の機序がイマイチわかりません……
ムーブを経由させずにどうやってユニークポインタを再確保出来る証拠でしょうか……?
どちらの方法でも、実行する場合の注意点があればなんでも教えていただければ幸いです(^O^)/
また上記以外の方法も、もし存在するならば教えていただけると嬉しいです(´;ω;`)
先にお礼申し上げます。ありがとうございます。
class hogeにおいてメンバ変数unique_ptr<toge>toge1を所有しております。
vector<hoge> vHogeを運用するとき、hogeのインスタンスをプッシュバックしようとすると、削除された関数ですというエラーメッセージが帰ってまいります。
おそらくtoge1がユニークポインタであり、ムーブ以外の移動が不可能だからだと思うのですが……このままプッシュバックさせるのに何か方法はありますでしょうか?
健作でtoge1にshared_ptrを使う、hogeのコピーコンストラクタにmemcpyを使う等の解を見つけました。
私ごとですが、shared_ptrは循環参照で失敗した哀しい過去があり、恐怖感があります。
またmemcpyでユニークポインタをメモリコピーする場合の機序がイマイチわかりません……
ムーブを経由させずにどうやってユニークポインタを再確保出来る証拠でしょうか……?
どちらの方法でも、実行する場合の注意点があればなんでも教えていただければ幸いです(^O^)/
また上記以外の方法も、もし存在するならば教えていただけると嬉しいです(´;ω;`)
先にお礼申し上げます。ありがとうございます。
328デフォルトの名無しさん
2021/12/10(金) 22:05:57.88ID:4aSHek6G >>326
もとはといえオメェが勘違いしたからだろこのヒトモドキが
もとはといえオメェが勘違いしたからだろこのヒトモドキが
329デフォルトの名無しさん
2021/12/10(金) 22:09:42.92ID:G7csYfUf330デフォルトの名無しさん
2021/12/10(金) 22:20:49.71ID:Yfltgwdt >>322
普通事前に弾くとかドヤ顔で言われてもそんなの200も承知の助なんだよ
ああいう不測な組み方で死にかねない爆弾抱えるデメリットに比べたら
unsignedなことによるメリットなんて実質ほぼないカスみたいなもんだからsizeがunsignedなのは設計ミスではって話
普通事前に弾くとかドヤ顔で言われてもそんなの200も承知の助なんだよ
ああいう不測な組み方で死にかねない爆弾抱えるデメリットに比べたら
unsignedなことによるメリットなんて実質ほぼないカスみたいなもんだからsizeがunsignedなのは設計ミスではって話
331デフォルトの名無しさん
2021/12/10(金) 22:23:19.44ID:caXqow3a 申し訳ございません( ✌︎'ω')✌︎
遅れましたがこれです。
プッシュバックでエラーががが
struct Toge{
int a=0;
};
struct hoge {
std::unique_ptr<toge> toge1;
};
int main ()
{
std::vector<hoge> vHoge;
hoge hoge001;
vHoge.push_back(hoge001);
}
遅れましたがこれです。
プッシュバックでエラーががが
struct Toge{
int a=0;
};
struct hoge {
std::unique_ptr<toge> toge1;
};
int main ()
{
std::vector<hoge> vHoge;
hoge hoge001;
vHoge.push_back(hoge001);
}
332デフォルトの名無しさん
2021/12/10(金) 22:24:50.14ID:caXqow3a 大文字になってしまった……
struct Toge >>> struct toge
と思っていただければ……
struct Toge >>> struct toge
と思っていただければ……
333デフォルトの名無しさん
2021/12/10(金) 22:34:31.10ID:iN+TjAqi vHoge.push_back(std::move(hoge001));
334デフォルトの名無しさん
2021/12/10(金) 22:36:13.76ID:AEk60g9j vectorに突っ込んだらもうhoge001は使わないんだったらvHoge.push_back(std::move(hoge001));
コピーさせたいならhogeにこんなコピコンとコピop=を定義しとけばいい
hoge(const hoge& other) : toge1(new toge(*other.toge1)){}
基本はmoveだけど時々コピーもしたいくらいなら特殊関数じゃなくてclone()みたいな関数にしておく
どれがいいかは本当の用途と目的で選んで
コピーさせたいならhogeにこんなコピコンとコピop=を定義しとけばいい
hoge(const hoge& other) : toge1(new toge(*other.toge1)){}
基本はmoveだけど時々コピーもしたいくらいなら特殊関数じゃなくてclone()みたいな関数にしておく
どれがいいかは本当の用途と目的で選んで
335デフォルトの名無しさん
2021/12/10(金) 22:37:31.61ID:G7csYfUf >>332
コンパイルエラーを直してください
https://ideone.com/RxQYii
>>330
承知してるなら弾け
今回の用件はsize_type使えばいいだけなのでunsignedかどうかは関係ない
コンパイルエラーを直してください
https://ideone.com/RxQYii
>>330
承知してるなら弾け
今回の用件はsize_type使えばいいだけなのでunsignedかどうかは関係ない
336はちみつ餃子 ◆8X2XSCHEME
2021/12/10(金) 22:52:51.98ID:ogq0Brkp >>327
> hogeのコピーコンストラクタにmemcpyを使う等の解
これについてはダメ。
設計上の話ではなく言語仕様での保証がない。
そんなのがまかり通ったらスマートポインタの意味がない。
型が trivially copyable の要件を満たすときだけ memcpy でのコピーが許されている。
> hogeのコピーコンストラクタにmemcpyを使う等の解
これについてはダメ。
設計上の話ではなく言語仕様での保証がない。
そんなのがまかり通ったらスマートポインタの意味がない。
型が trivially copyable の要件を満たすときだけ memcpy でのコピーが許されている。
337デフォルトの名無しさん
2021/12/10(金) 23:02:05.91ID:4aSHek6G338デフォルトの名無しさん
2021/12/10(金) 23:18:01.33ID:G7csYfUf >>337
なんだか煽ってばかりですね。質問内容は明快にしないといけないので。
なんだか煽ってばかりですね。質問内容は明快にしないといけないので。
339デフォルトの名無しさん
2021/12/10(金) 23:22:36.91ID:4aSHek6G ああ言えば上裕
オメェそっくり
オメェそっくり
340デフォルトの名無しさん
2021/12/10(金) 23:40:14.88ID:Yfltgwdt341デフォルトの名無しさん
2021/12/10(金) 23:41:07.01ID:caXqow3a■ このスレッドは過去ログ倉庫に格納されています
