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:xvjipUWj241デフォルトの名無しさん
2020/02/27(木) 08:56:58.29ID:gp31hmMe だから堅牢性よか速さが欲しい
数十億ポリゴン使うなら速さを優先しないとそのソフトは実用じゃない
描画されないとそのソフトが存在する価値がないからな
数十億ポリゴン使うなら速さを優先しないとそのソフトは実用じゃない
描画されないとそのソフトが存在する価値がないからな
242デフォルトの名無しさん
2020/02/27(木) 09:02:02.25ID:MeoIkHme 自分はソフト屋でございハードは全くわかりません
なやつが詰むケースだな
なやつが詰むケースだな
243デフォルトの名無しさん
2020/02/27(木) 09:53:05.86ID:G3iz3let 絶対安全で一日かかるプログラムよりも
3回に一回は落ちるが10分で終わるプログラムのが価値のある場面は多いよ。
まあ場面によるしトレードオフの話だからどっちでもいいのだが
意固地になるのは違うだろうという話。
3回に一回は落ちるが10分で終わるプログラムのが価値のある場面は多いよ。
まあ場面によるしトレードオフの話だからどっちでもいいのだが
意固地になるのは違うだろうという話。
244デフォルトの名無しさん
2020/02/27(木) 10:21:33.33ID:MeoIkHme 「落ちる」ことなく一見正常終了のように振る舞い誤った結果を出力するゴミプログラムの価値はゼロ
245デフォルトの名無しさん
2020/02/27(木) 15:59:17.88ID:HQmHUU7r コンパイラの最適化に期待するコードを書くよりも、処理するデータ量を減らす努力をしたほうがいい。
246デフォルトの名無しさん
2020/02/27(木) 16:13:34.90ID:MeoIkHme 「ほうがいい」 「よりまし」と言って下位に位置づけたものを不要という暴論
247デフォルトの名無しさん
2020/02/27(木) 18:10:34.05ID:DcMelsSn 3回に1回落ちるようなクソプログラムが配列末端や不正ポインタからゴミを読んで計算結果に混入させてないと誰が保証してくれるの?
そんなゴミクズを混入して一生懸命計算したゴミ結果に何の価値があるの?
何でもいいからそれっぽい数字が出てりゃいいの?だったら/dev/urandomから適当に数字吐くスクリプトで十分だな
お前のクソプログラムの価値はその程度だ
そんなゴミクズを混入して一生懸命計算したゴミ結果に何の価値があるの?
何でもいいからそれっぽい数字が出てりゃいいの?だったら/dev/urandomから適当に数字吐くスクリプトで十分だな
お前のクソプログラムの価値はその程度だ
248デフォルトの名無しさん
2020/02/27(木) 20:16:23.17ID:6N44UBOd249デフォルトの名無しさん
2020/02/27(木) 20:19:13.39ID:6N44UBOd >>247
> 3回に1回落ちるようなクソプログラムが配列末端や不正ポインタからゴミを読んで計算結果に混入させてないと誰が保証してくれるの?
絶対安全で一日かかるプログラムの出力も誰も保証してくれないけどねw
> 3回に1回落ちるようなクソプログラムが配列末端や不正ポインタからゴミを読んで計算結果に混入させてないと誰が保証してくれるの?
絶対安全で一日かかるプログラムの出力も誰も保証してくれないけどねw
250デフォルトの名無しさん
2020/02/27(木) 20:22:55.14ID:MeoIkHme 日本語でおk
251デフォルトの名無しさん
2020/02/27(木) 20:25:59.58ID:gTm/hLBR だいたい新バージョンってのは新機能だったり高速化だったりが売りになっている。
旧バージョンでも動いてたシミュレーションはベンダーでもユーザーでも同一の結果が出るか確認するからバグはあまり混入しない
ある程度ユーザー側で検証が済んでからユーザーは移行する。
新機能はパラメータがちょっと違うだけでバグったりするから安定するまで結構な頻度で更新版が出る。
旧バージョンでも動いてたシミュレーションはベンダーでもユーザーでも同一の結果が出るか確認するからバグはあまり混入しない
ある程度ユーザー側で検証が済んでからユーザーは移行する。
新機能はパラメータがちょっと違うだけでバグったりするから安定するまで結構な頻度で更新版が出る。
252デフォルトの名無しさん
2020/02/27(木) 20:28:40.63ID:gTm/hLBR 自分の利用する範囲で正常系入力にたいして妥当な結果さえ出ていれば、それ以外でどんなに酷いバグが混入していようがユーザーはあまり気にしない
ユーザーによってはバグフィックス版への移行に対しても慎重なところも良くある。
ユーザーによってはバグフィックス版への移行に対しても慎重なところも良くある。
253デフォルトの名無しさん
2020/02/27(木) 21:17:41.74ID:0ftqea78 そろそろC++の話に戻ろうか
254デフォルトの名無しさん
2020/02/27(木) 21:27:11.49ID:Y1qHWJOB わかった、C++の話にもどろう・・
まずはC++で堅牢なメモリリークのないポインタ管理をすべきか
それとも速度優先である程度のリスクを負うコードを書くほうがいいかについて
まずはC++で堅牢なメモリリークのないポインタ管理をすべきか
それとも速度優先である程度のリスクを負うコードを書くほうがいいかについて
255デフォルトの名無しさん
2020/02/27(木) 21:33:59.93ID:01yj9LF4 つか、速度必要なところではポインタに変換して演算するけど所有権管理はスマポでやるだろ
256デフォルトの名無しさん
2020/02/27(木) 22:46:18.56ID:MeoIkHme257デフォルトの名無しさん
2020/02/27(木) 23:33:30.63ID:G3iz3let258デフォルトの名無しさん
2020/02/27(木) 23:37:21.61ID:KVIeYgu/259デフォルトの名無しさん
2020/02/27(木) 23:56:49.44ID:09BJJqOH バカが極論語るというよりも
素人が空想語るって感じだけどいつもこのスレってw
素人が空想語るって感じだけどいつもこのスレってw
260デフォルトの名無しさん
2020/02/28(金) 00:35:10.61ID:ANl57hab ファイルのバイナリ読み込みをしています。
下記のように最初の2バイトが単位レコードのバイト数を表しているとき、
単位レコード全体を表示しようとしているのですが、うまくいきません。
どうすれば表示できますか?
00 08 FF FF FF FF FF FF
-----
|
+----------------- レコードのバイト数
typedef unsigned char BYTE;
// dataはすでにファイルからバイナリデータとして読み込んでいるもの
int rec_size = (data[0] << 8 | data[0+1]);
BYTE* temp;
temp = (unsigned char*)malloc(sizeof(BYTE)*rec_size+1); // 改行を含めたメモリ確保をしているつもり
memcpy(temp, 0, (size_t)sizeof(BYTE)*rec_size);
temp[sizeof(BYTE)*rec_size] = "0A"; // 改行コード挿入しているつもり
printf("AAAAA %s\n", *temp); //レコード単位を表示
exit(EXIT_FAILURE);
下記のように最初の2バイトが単位レコードのバイト数を表しているとき、
単位レコード全体を表示しようとしているのですが、うまくいきません。
どうすれば表示できますか?
00 08 FF FF FF FF FF FF
-----
|
+----------------- レコードのバイト数
typedef unsigned char BYTE;
// dataはすでにファイルからバイナリデータとして読み込んでいるもの
int rec_size = (data[0] << 8 | data[0+1]);
BYTE* temp;
temp = (unsigned char*)malloc(sizeof(BYTE)*rec_size+1); // 改行を含めたメモリ確保をしているつもり
memcpy(temp, 0, (size_t)sizeof(BYTE)*rec_size);
temp[sizeof(BYTE)*rec_size] = "0A"; // 改行コード挿入しているつもり
printf("AAAAA %s\n", *temp); //レコード単位を表示
exit(EXIT_FAILURE);
261デフォルトの名無しさん
2020/02/28(金) 00:42:03.60ID:bgqQewMR memcpy(temp, 0, (size_t)sizeof(BYTE)*rec_size);
262デフォルトの名無しさん
2020/02/28(金) 00:44:25.91ID:ANl57hab まずそもそもunsigned charは文字列ではないから%sではだめですね。
どうすれば16進数表示が出来ますか?
どうすれば16進数表示が出来ますか?
263デフォルトの名無しさん
2020/02/28(金) 00:45:57.88ID:bgqQewMR あるいはこれか
printf("AAAAA %s\n", *temp); //レコード単位を表示
printf("AAAAA %s\n", *temp); //レコード単位を表示
264デフォルトの名無しさん
2020/02/28(金) 00:47:19.38ID:bgqQewMR265デフォルトの名無しさん
2020/02/28(金) 00:52:57.99ID:YKTB7lSA あまりにぶっ壊れすぎて何がしたいのか分からん
レコードってのは長さの2byteを含む?
長さ以外は文字コードでそれを文字列として表示したい?
それともバイナリで16進表示したい?
レコードってのは長さの2byteを含む?
長さ以外は文字コードでそれを文字列として表示したい?
それともバイナリで16進表示したい?
266デフォルトの名無しさん
2020/02/28(金) 00:53:13.01ID:ANl57hab %xにしたらコンパイル通りました。が、出力結果は「0」になりました。。
typedef unsigned char BYTE;
// dataはすでにファイルからバイナリデータとして読み込んでいるもの
int rec_size = (data[0] << 8 | data[0+1]);
BYTE* temp;
temp = (unsigned char*)malloc(sizeof(BYTE)*rec_size);
memcpy(temp, 0, (size_t)sizeof(BYTE)*rec_size);
printf("AAAAA %x\n", *temp);
typedef unsigned char BYTE;
// dataはすでにファイルからバイナリデータとして読み込んでいるもの
int rec_size = (data[0] << 8 | data[0+1]);
BYTE* temp;
temp = (unsigned char*)malloc(sizeof(BYTE)*rec_size);
memcpy(temp, 0, (size_t)sizeof(BYTE)*rec_size);
printf("AAAAA %x\n", *temp);
267デフォルトの名無しさん
2020/02/28(金) 00:57:06.59ID:ANl57hab 下記バイナリデータがあったときに、頭の2バイトが8なので、8バイトをtempに格納し16進数で表示したいです。
連続したバイナリデータで今読み込んでいるレコード単位がどの部分を読み込んでいるのかを確認しようとしています。
data = 0x0008AABBCCDDEEFF
連続したバイナリデータで今読み込んでいるレコード単位がどの部分を読み込んでいるのかを確認しようとしています。
data = 0x0008AABBCCDDEEFF
268デフォルトの名無しさん
2020/02/28(金) 01:02:23.82ID:ANl57hab 実際のdataには下記のようにバイナリファイルの全データを読み込んでいるので、そのうちの一区切りのレコードを表示したいです。
data = 0x0008AABBCCDDEEFF0004AABB0005AABBCC
よく考えたらtempにmemcpyせずにdataから直接表示できればそれでもいい気がしてきました。
data = 0x0008AABBCCDDEEFF0004AABB0005AABBCC
よく考えたらtempにmemcpyせずにdataから直接表示できればそれでもいい気がしてきました。
269デフォルトの名無しさん
2020/02/28(金) 01:03:07.59ID:cn9U0Abk 貼ってるコードがデタラメすぎて意味不明だからとりあえずやりたそうなことをベタ書きするぞ
これで合ってるか?これをカッコよく書きたいって話?
for(int i=0; i<rec_size; ++i){
printf("%x\n", data[2+i]);
}
printf("\n");
これで合ってるか?これをカッコよく書きたいって話?
for(int i=0; i<rec_size; ++i){
printf("%x\n", data[2+i]);
}
printf("\n");
270デフォルトの名無しさん
2020/02/28(金) 01:10:04.09ID:ANl57hab271デフォルトの名無しさん
2020/02/28(金) 01:16:02.14ID:YKTB7lSA for(size_t i=0,l=0;i<全体の長さ;i+=l){
l=data[i]<<8 + data[i+1];
for(size_t j=0;j<l;++j) {
printf("%02.2X ",data[i+j]);
}
printf("¥n");
}
l=data[i]<<8 + data[i+1];
for(size_t j=0;j<l;++j) {
printf("%02.2X ",data[i+j]);
}
printf("¥n");
}
272デフォルトの名無しさん
2020/02/28(金) 01:21:12.05ID:YKTB7lSA l=... + ...
じゃなく... | ...
じゃなく... | ...
273デフォルトの名無しさん
2020/02/28(金) 01:25:11.44ID:ANl57hab ありがとうございます。
bit演算させて%02Xで表示させるんですね。
%02.2X は %02X になりますか?
bit演算させて%02Xで表示させるんですね。
%02.2X は %02X になりますか?
274デフォルトの名無しさん
2020/02/28(金) 01:28:52.77ID:YKTB7lSA .2はいらなかった
275デフォルトの名無しさん
2020/02/28(金) 01:31:26.71ID:ANl57hab うまく表示できました!
今勉強中で助かりました。
ありがとうございました。
今勉強中で助かりました。
ありがとうございました。
276デフォルトの名無しさん
2020/02/28(金) 08:17:52.68ID:HgMPj0rf >>275
いえいえ、お礼なんか要りませんよ
いえいえ、お礼なんか要りませんよ
277デフォルトの名無しさん
2020/02/28(金) 14:55:15.47ID:IJJvPlCN また行き詰ったので教えてください。。
http://codepad.org/YzpjTJeN
上記コードで3つわからないことがあります。
(1)itemsリストを作り、構造体のITEM_A, ITEM_B, を追加していく
そもそも構造体の中身が違うものを一つのリストに追加できるのか不明。
(2) itemsに動的にリスト追加
(3) itemsのリストをfor()で1要素づつ表示させる
※(1)(2)がわかれば(3)は自分でもわかるとは思いますが。
どのように書けばよいかわかりますでしょうか?
http://codepad.org/YzpjTJeN
上記コードで3つわからないことがあります。
(1)itemsリストを作り、構造体のITEM_A, ITEM_B, を追加していく
そもそも構造体の中身が違うものを一つのリストに追加できるのか不明。
(2) itemsに動的にリスト追加
(3) itemsのリストをfor()で1要素づつ表示させる
※(1)(2)がわかれば(3)は自分でもわかるとは思いますが。
どのように書けばよいかわかりますでしょうか?
278デフォルトの名無しさん
2020/02/28(金) 15:06:55.04ID:IJJvPlCN itemの数が膨大にあり速度がほしいので、リストに追加するところは先に個数を確保したいのですが、0xEEまで精査しないと何itemあるのかわからないので、vectorで動的追加しかないかなと思っています。
emplace_backだとpush_backよりは多少速い?
emplace_backだとpush_backよりは多少速い?
279デフォルトの名無しさん
2020/02/28(金) 15:56:05.44ID:lgmUZMDZ >>277
ITEM_AとITEM_Bってtypeの値が違うだけで同じ構造体で良いような気がするが…
ITEM_AとITEM_Bってtypeの値が違うだけで同じ構造体で良いような気がするが…
280デフォルトの名無しさん
2020/02/28(金) 16:36:45.32ID:Zl8S5zbV >>268
ダンプするだけか。
ダンプするだけか。
281デフォルトの名無しさん
2020/02/28(金) 17:40:47.76ID:nMLR2isw vector使うかどうかよりも、毎回raw領域確保するほうがよっぽど問題と思うよ。
dataは何処かにおいておいて、rawにコピーせずに場所だけ指し示すようにしたほうがいい。
いずれにしても、計測なき最適化は害悪。
dataは何処かにおいておいて、rawにコピーせずに場所だけ指し示すようにしたほうがいい。
いずれにしても、計測なき最適化は害悪。
282はちみつ餃子 ◆8X2XSCHEME
2020/02/28(金) 17:47:29.10ID:OpAeM4nJ283デフォルトの名無しさん
2020/02/28(金) 18:14:07.42ID:6NG7oGkA 新型肺炎COVID-19は人工的に作られたともそうでないとも言われている。
プログラマの意図しないバグを含むプログラムを公開してしまったとしたら、そのプログラムは人工的ではないと言えるのか?
プログラマの意図しないバグを含むプログラムを公開してしまったとしたら、そのプログラムは人工的ではないと言えるのか?
284デフォルトの名無しさん
2020/02/28(金) 18:17:18.92ID:6NG7oGkA 人工の定義は?
285はちみつ餃子 ◆8X2XSCHEME
2020/02/28(金) 19:23:47.33ID:OpAeM4nJ286デフォルトの名無しさん
2020/02/28(金) 19:55:10.54ID:ZcWDRqtu このプログラムの最終目的はなんなんだろう
作ったitemsリストは表示するだけじゃなくて後で別の目的に利用するのかな
作ったitemsリストは表示するだけじゃなくて後で別の目的に利用するのかな
287デフォルトの名無しさん
2020/02/28(金) 20:34:59.53ID:eXGvTrLS std::stringをkeyにして作成されたstd::mapからfind関数を用いて検索する際に、
std::string_viewを利用して検索をかけたいのですが可能でしょうか?
もしくはstd::string_viewを利用して検索する方法等はあるのでしょうか?
std::string_viewを利用して検索をかけたいのですが可能でしょうか?
もしくはstd::string_viewを利用して検索する方法等はあるのでしょうか?
288デフォルトの名無しさん
2020/02/28(金) 21:36:33.76ID:IJJvPlCN 色々ご意見ありがとうございます。
>>279,280,281
後出し情報で申し訳ありませんが、バイナリファイルを読み込んで
そのバイナリデータの途中に別のレコードを追加したり、
削除したり、文字列置換したり、
といったことを行い、最後にファイルに書き出そうと考えています。
>>286
ご推察の通り、データを読み込んで一部を加工したファイルを出力しようとしていました。
>>282,285
サンプルコードありがとうございます。
ふんだんにc++の文法が使われているので、作っていただいたサンプルコードを今調べているところです。。
まだc言語レベルの記述しか理解できていないので。
とりあえずイテレータ部分を調べています。
加工しやすいように一度内部で数値や文字列に変換したdatabaseを作り、それに対し追加、削除、文字列置換などの加工をしてファイルに出力する。
というフローを考えていましたが、みなさんのご意見を参考にファイル出力するときに加工しながら出力する方式で検討してみようと思います。
>>279,280,281
後出し情報で申し訳ありませんが、バイナリファイルを読み込んで
そのバイナリデータの途中に別のレコードを追加したり、
削除したり、文字列置換したり、
といったことを行い、最後にファイルに書き出そうと考えています。
>>286
ご推察の通り、データを読み込んで一部を加工したファイルを出力しようとしていました。
>>282,285
サンプルコードありがとうございます。
ふんだんにc++の文法が使われているので、作っていただいたサンプルコードを今調べているところです。。
まだc言語レベルの記述しか理解できていないので。
とりあえずイテレータ部分を調べています。
加工しやすいように一度内部で数値や文字列に変換したdatabaseを作り、それに対し追加、削除、文字列置換などの加工をしてファイルに出力する。
というフローを考えていましたが、みなさんのご意見を参考にファイル出力するときに加工しながら出力する方式で検討してみようと思います。
289デフォルトの名無しさん
2020/02/28(金) 21:40:11.81ID:YKTB7lSA290デフォルトの名無しさん
2020/02/28(金) 22:23:20.74ID:lgmUZMDZ291デフォルトの名無しさん
2020/02/28(金) 23:38:48.68ID:ANl57hab292はちみつ餃子 ◆8X2XSCHEME
2020/02/29(土) 01:31:35.79ID:WzbNfV7+ C++ は C と互換性があって C の延長線上でも使えるのが利点だとは C++ の設計者自身も言ってるけど、
C の延長線上で使ってたらやっぱり C の延長線上な設計になっちゃうと思うんだよなー。
その延長線を伸ばしていっていずれ C++ の習得に至る (あるいは至らなくてもよい) 、みたいな想定らしいんだけど、
今となっては C から C++ の距離がデカすぎる気がしてる。
だからどうするのが良いという意見はないのでぼんやりした感想でしかないけど。
C の延長線上で使ってたらやっぱり C の延長線上な設計になっちゃうと思うんだよなー。
その延長線を伸ばしていっていずれ C++ の習得に至る (あるいは至らなくてもよい) 、みたいな想定らしいんだけど、
今となっては C から C++ の距離がデカすぎる気がしてる。
だからどうするのが良いという意見はないのでぼんやりした感想でしかないけど。
293デフォルトの名無しさん
2020/02/29(土) 01:51:00.65ID:VOzt624K 今や互換性があるというよりも使いやすいFFIがあるって認識のがメジャーだろう。
294デフォルトの名無しさん
2020/02/29(土) 04:10:54.37ID:TuWp9ykk >>277
codepadはC++03だったと思うが、03では構造体のメンバの=によるデフォルト初期化は
(static constな、配列でない組み込み型を除いて?)許可されてない
ので14が使えるideoneになるけどとりあえず最低限動くようにした
https://ideone.com/1RUIfn
どうしても03じゃないと困るなら直す
あとRuntime Errorって出るのは単にmainで1を返してるから(0にしたら直る)
特に関数の戻り値を使いもしないのに常にintにしてreturn (1)って書くのやめたほうがいいよ
>>292
>今となっては C から C++ の距離がデカすぎる
そう思うなら余計な改変はしないでやれよ
codepadはC++03だったと思うが、03では構造体のメンバの=によるデフォルト初期化は
(static constな、配列でない組み込み型を除いて?)許可されてない
ので14が使えるideoneになるけどとりあえず最低限動くようにした
https://ideone.com/1RUIfn
どうしても03じゃないと困るなら直す
あとRuntime Errorって出るのは単にmainで1を返してるから(0にしたら直る)
特に関数の戻り値を使いもしないのに常にintにしてreturn (1)って書くのやめたほうがいいよ
>>292
>今となっては C から C++ の距離がデカすぎる
そう思うなら余計な改変はしないでやれよ
295デフォルトの名無しさん
2020/02/29(土) 04:27:18.26ID:TuWp9ykk あ、そういえばバイト列全部持ってるから別にサイズ入れる必要無かった
296デフォルトの名無しさん
2020/02/29(土) 08:31:09.13ID:wNArNR7j297デフォルトの名無しさん
2020/02/29(土) 09:47:01.15ID:GnUNXfgB >>296
vectorについて調べてみました。
>ttp://vivi.dyndns.org/tech/cpp/vector.html
上記に下記がありました。
>insert() の処理時間は O(N) 。O(N) とは配列要素数に比例して処理時間を要するという意味。 データ数が100倍になると、処理時間も100倍になる。
>それに対して push_back() は O(1) なので、データ数がいくら増えても常に一定時間で処理が終わる。
大量のリストで先頭の方に挿入するとやばそうですね。
これは気にしていませんでした。
ありがとうございます。
vectorについて調べてみました。
>ttp://vivi.dyndns.org/tech/cpp/vector.html
上記に下記がありました。
>insert() の処理時間は O(N) 。O(N) とは配列要素数に比例して処理時間を要するという意味。 データ数が100倍になると、処理時間も100倍になる。
>それに対して push_back() は O(1) なので、データ数がいくら増えても常に一定時間で処理が終わる。
大量のリストで先頭の方に挿入するとやばそうですね。
これは気にしていませんでした。
ありがとうございます。
298デフォルトの名無しさん
2020/02/29(土) 11:08:38.27ID:ih/BSqRh listは要素を手繰るのがクッソ遅いから、事前に挿入位置のノードのポインタを知っている状況でないといけないことに注意
毎回前からスキャンして挿入なんてやってたら結局O(N)でメモリアクセス効率がゲロ悪い分だけvectorより遥かに遅い
毎回前からスキャンして挿入なんてやってたら結局O(N)でメモリアクセス効率がゲロ悪い分だけvectorより遥かに遅い
299デフォルトの名無しさん
2020/02/29(土) 11:23:57.34ID:5T8vHxV4 C89とC2xの距離も大きくなってるけどな
あっちがこっちに寄ってきてるから
あっちがこっちに寄ってきてるから
300デフォルトの名無しさん
2020/02/29(土) 12:12:18.31ID:Xdrhue/n >>298はなぜかvectorだと瞬時に検索できると思ってるw
301デフォルトの名無しさん
2020/02/29(土) 12:18:08.81ID:Cury2uAw 検索とかどこから出て来たんだ
302デフォルトの名無しさん
2020/02/29(土) 12:20:17.33ID:Cury2uAw ていうかとりあえず組み上げてから実測した方がいいよ、似たようなことはすでに言われてるけど
303デフォルトの名無しさん
2020/02/29(土) 12:48:35.09ID:gvjpz0iS dequeにしてみれば
304はちみつ餃子 ◆8X2XSCHEME
2020/02/29(土) 12:54:52.89ID:WzbNfV7+ >>297
vector の方が先頭に追加するのが速いこともあるという観測データが有る。
https://cpplover.blogspot.com/2017/02/c-p0550r0-p0601r0.html
今時の機械は事情が複雑すぎて予想できない。
まず実測しろってよく言われているのはこういうこと。
やってみてからどこが効いてるのか調べた方がいい。
vector の方が先頭に追加するのが速いこともあるという観測データが有る。
https://cpplover.blogspot.com/2017/02/c-p0550r0-p0601r0.html
今時の機械は事情が複雑すぎて予想できない。
まず実測しろってよく言われているのはこういうこと。
やってみてからどこが効いてるのか調べた方がいい。
305デフォルトの名無しさん
2020/02/29(土) 13:18:08.51ID:GVKyjNMb >>300
少なくともlistに比べたら瞬時だね
さすがに挿入位置まで毎回スキャンしてたらlistに勝ち目はほぼ無いから、そこで突っかかるのはさすがに無理筋
listを擁護したいなら先頭への挿入か挿入位置のノードのポインタが既知のケースに話を限定しなさい
少なくともlistに比べたら瞬時だね
さすがに挿入位置まで毎回スキャンしてたらlistに勝ち目はほぼ無いから、そこで突っかかるのはさすがに無理筋
listを擁護したいなら先頭への挿入か挿入位置のノードのポインタが既知のケースに話を限定しなさい
306デフォルトの名無しさん
2020/02/29(土) 13:53:20.08ID:wNArNR7j307デフォルトの名無しさん
2020/02/29(土) 14:00:40.18ID:bs6YePUD 挿入が主な目的な場合って普通はheap使うんじゃねーの?
あんまり任意の位置に挿入するってシチュエーションはないように思う。
あんまり任意の位置に挿入するってシチュエーションはないように思う。
308デフォルトの名無しさん
2020/02/29(土) 14:13:58.78ID:B70Sj2ZJ309デフォルトの名無しさん
2020/02/29(土) 14:38:39.67ID:ZbPwrBbB310デフォルトの名無しさん
2020/02/29(土) 14:41:54.28ID:ZbPwrBbB >>298
Cでは、リンクリストを使って、ノードの位置を保持するためには、index値ではなく、ポインタ値を用いる。
STLでは、index値を前面に使う設計になっているのが問題。
元々、リンクリストは、ノードを巡るのは非常に高速。
ノードの位置をポインタで維持している限り「検索」作業は入らない。
Cでは、リンクリストを使って、ノードの位置を保持するためには、index値ではなく、ポインタ値を用いる。
STLでは、index値を前面に使う設計になっているのが問題。
元々、リンクリストは、ノードを巡るのは非常に高速。
ノードの位置をポインタで維持している限り「検索」作業は入らない。
311デフォルトの名無しさん
2020/02/29(土) 14:44:16.50ID:ZbPwrBbB std::listには問題が有るかもしれないが、リンクリストというデータ構造自体は、文字列(string, CStringなど)のクラスを作るためなどをの一部の例外を除いては、動的配列よりもほぼ全面的に優れていると言っても過言ではない。
312デフォルトの名無しさん
2020/02/29(土) 14:45:35.17ID:ZbPwrBbB 本来は、Cの最も優れている点を言えといえば、そのリンクリスト一点と言っても過言ではない。
313デフォルトの名無しさん
2020/02/29(土) 14:49:01.60ID:ZbPwrBbB314はちみつ餃子 ◆8X2XSCHEME
2020/02/29(土) 14:59:22.48ID:WzbNfV7+315デフォルトの名無しさん
2020/02/29(土) 15:05:36.96ID:VpO1O9GW この前からヒープヒープ言う小僧がいるけど
普通ヒープといえば
- 木構造のヒープ
- ヒープメモリのヒープ
どっちだと思う?
おれは後者だけど
普通ヒープといえば
- 木構造のヒープ
- ヒープメモリのヒープ
どっちだと思う?
おれは後者だけど
316デフォルトの名無しさん
2020/02/29(土) 15:11:14.78ID:1OIyhpL7 文脈によらない「普通」なんてないだろ。
「ヒープ」と出てきたらどっちの意味で使っているのか注意しなきゃならない。
「ヒープ」と出てきたらどっちの意味で使っているのか注意しなきゃならない。
317デフォルトの名無しさん
2020/02/29(土) 15:32:56.54ID:ZbPwrBbB318デフォルトの名無しさん
2020/02/29(土) 15:34:53.49ID:HY2ZFlSm 順繰りたどらなくていいリンクリストってあるの
319デフォルトの名無しさん
2020/02/29(土) 15:40:33.93ID:GnUNXfgB 下記のようにすると、最後にprintfしているときにはnameに値が入っていません。
set()を抜けたときに開放されてしまうのではと思うのですが、どうすれば保持出来ますか?
char* name; のところを char name; にはしたくないと思っています。
mallocとかを使うのでしょうか?
class AAA{
public:
char* name;
};
int AAA::set(){
char temp_name[5]; ←ここで確保した変数がset()が終わると開放されてしまう??
temp_name = "NAMAE";
name = temp_name;
return(1);
}
void main(){
AAA aaa;
aaa.set();
printf("NAME %s\n", aaa.name);
}
set()を抜けたときに開放されてしまうのではと思うのですが、どうすれば保持出来ますか?
char* name; のところを char name; にはしたくないと思っています。
mallocとかを使うのでしょうか?
class AAA{
public:
char* name;
};
int AAA::set(){
char temp_name[5]; ←ここで確保した変数がset()が終わると開放されてしまう??
temp_name = "NAMAE";
name = temp_name;
return(1);
}
void main(){
AAA aaa;
aaa.set();
printf("NAME %s\n", aaa.name);
}
320デフォルトの名無しさん
2020/02/29(土) 15:44:30.24ID:ZbPwrBbB >>298
例えばテキスト・エディタを作っている場合、ある一点Aに50文字を挿入する
というようなことがおきる。
この場合、50文字を挿入する前に、Aの場所のノードのポインタ値を求める。
カーソルの位置に挿入する場合には、最初からポインタ値を持っているようにしていれば「求める」必要は無い。
一度ポインタ値が分かった後は、50文字追加する際に挿入場所として必要なポインタ値は長々と最初から「たどる」ことなく分かる。
たどる場合も、各行の先頭のポインタ値をすべて保持するようにしておけば、まず行Yの先頭のポインタ値を見つけて、あとは、そこから列Xのポイント値を求めるための計算量は余り多くは無い。
このような場合、全てのデータをstd::vectorのような動的配列で保持しようとするのは基本的に速度が遅くなることが多いが、リンクリストは速度的に安定する。
例えばテキスト・エディタを作っている場合、ある一点Aに50文字を挿入する
というようなことがおきる。
この場合、50文字を挿入する前に、Aの場所のノードのポインタ値を求める。
カーソルの位置に挿入する場合には、最初からポインタ値を持っているようにしていれば「求める」必要は無い。
一度ポインタ値が分かった後は、50文字追加する際に挿入場所として必要なポインタ値は長々と最初から「たどる」ことなく分かる。
たどる場合も、各行の先頭のポインタ値をすべて保持するようにしておけば、まず行Yの先頭のポインタ値を見つけて、あとは、そこから列Xのポイント値を求めるための計算量は余り多くは無い。
このような場合、全てのデータをstd::vectorのような動的配列で保持しようとするのは基本的に速度が遅くなることが多いが、リンクリストは速度的に安定する。
321はちみつ餃子 ◆8X2XSCHEME
2020/02/29(土) 15:44:56.46ID:WzbNfV7+ >>317
vector と同じように考えるなってことを言ってるだけだと思うよ。
逆に vector では要素の追加とかがあった時にイテレータが無効になるので、
あまりイテレータで保持すべきではないという事情がある。
コンテナとして最低限度共通のインターフェイスが付いてるけど、
やっぱり内部の事情は意識しなけりゃなんねぇなぁという話。
vector と同じように考えるなってことを言ってるだけだと思うよ。
逆に vector では要素の追加とかがあった時にイテレータが無効になるので、
あまりイテレータで保持すべきではないという事情がある。
コンテナとして最低限度共通のインターフェイスが付いてるけど、
やっぱり内部の事情は意識しなけりゃなんねぇなぁという話。
322デフォルトの名無しさん
2020/02/29(土) 15:45:04.74ID:HY2ZFlSm スコープ抜けたら当然解放されるよ
c++ならchar*じゃなくてstd::stringでも使った方がいいのでは
c++ならchar*じゃなくてstd::stringでも使った方がいいのでは
323デフォルトの名無しさん
2020/02/29(土) 15:48:52.44ID:ZbPwrBbB >>320
例えばの話、要素数が多いような巨大なデータを動的配列で確保したとする。
この動的配列のトータルバイト数をW(バイト)としよう。
この配列の要素数が、本当の意味で増やす動作が入ったときには、メモリの容量が
一時的に 3*W(バイト)必要になる。
Wが実メモリのぎりぎりに入るくらい大きい場合には、仮想記憶が必要となりとても遅くなる。
一方、リンクリストだとそのようなことがない。
例えばの話、要素数が多いような巨大なデータを動的配列で確保したとする。
この動的配列のトータルバイト数をW(バイト)としよう。
この配列の要素数が、本当の意味で増やす動作が入ったときには、メモリの容量が
一時的に 3*W(バイト)必要になる。
Wが実メモリのぎりぎりに入るくらい大きい場合には、仮想記憶が必要となりとても遅くなる。
一方、リンクリストだとそのようなことがない。
324デフォルトの名無しさん
2020/02/29(土) 15:50:57.05ID:ZbPwrBbB325デフォルトの名無しさん
2020/02/29(土) 15:53:18.38ID:ZbPwrBbB326はちみつ餃子 ◆8X2XSCHEME
2020/02/29(土) 15:57:30.04ID:WzbNfV7+327デフォルトの名無しさん
2020/02/29(土) 16:02:26.57ID:HY2ZFlSm いやポインタ使おうが無理でしょ...
リンクリストだとポインタ飛び飛びになるんだから辿らないと無理でしょ
リンクリストだとポインタ飛び飛びになるんだから辿らないと無理でしょ
328はちみつ餃子 ◆8X2XSCHEME
2020/02/29(土) 16:06:46.92ID:WzbNfV7+329デフォルトの名無しさん
2020/02/29(土) 16:10:08.53ID:HY2ZFlSm それだと298のいってること理解できるはずなんだけどね
ようわからんわ
ようわからんわ
330デフォルトの名無しさん
2020/02/29(土) 16:11:07.92ID:ZbPwrBbB >>327
「たどる」と言っても、隣のノードをたどる場合、コンパイル後のマシン語レベルだと、整数に1を足すのと同じか、その2回分程度のクロック数しか消費しない。
だから for 文で巡るときには、動的配列を巡るのと全く同じ程度しか時間が掛からない。
「たどる」と言っても、隣のノードをたどる場合、コンパイル後のマシン語レベルだと、整数に1を足すのと同じか、その2回分程度のクロック数しか消費しない。
だから for 文で巡るときには、動的配列を巡るのと全く同じ程度しか時間が掛からない。
331デフォルトの名無しさん
2020/02/29(土) 16:12:14.35ID:ZbPwrBbB332デフォルトの名無しさん
2020/02/29(土) 16:13:48.55ID:VpO1O9GW この教科書読めレベルの話、いちいち議論する必要なくね?
333デフォルトの名無しさん
2020/02/29(土) 16:16:42.57ID:HY2ZFlSm334デフォルトの名無しさん
2020/02/29(土) 16:17:00.93ID:/L84OmpW 全員が釣り師だと何もつれない。
335デフォルトの名無しさん
2020/02/29(土) 16:29:33.32ID:ZbPwrBbB336デフォルトの名無しさん
2020/02/29(土) 16:31:36.11ID:ZbPwrBbB >>335
または、ポインタが理解できないか、ポインタにアレルギーがあって、避けて通ってきた人かも知れない。
そういう人は多いらしい。
聞いた話だとポインタを全く使わずに配列だけでC言語を使っている人がいるそうだ。
または、ポインタが理解できないか、ポインタにアレルギーがあって、避けて通ってきた人かも知れない。
そういう人は多いらしい。
聞いた話だとポインタを全く使わずに配列だけでC言語を使っている人がいるそうだ。
337デフォルトの名無しさん
2020/02/29(土) 16:37:43.01ID:MKbmJ2zo 要はlistとvectorの違いは何で、なぜ必要かという文脈でいいのかな
listはfor文にi++入れないための単なる糖衣構文だと思うが
基本的に自分は糖衣構文は必要ない派です
listはfor文にi++入れないための単なる糖衣構文だと思うが
基本的に自分は糖衣構文は必要ない派です
338デフォルトの名無しさん
2020/02/29(土) 16:37:52.88ID:VpO1O9GW リンクリスト万能君も老害リストに追加だね
キャッシュヒット率低いし、64bitポインタの無駄もでかいし
メモリ空間異なるところもっていくときに全部作り直しだし
昨今はむしろ使えないデータ構造扱いされること多いから
c/c++を高速化のために使ってるならなおさら
キャッシュヒット率低いし、64bitポインタの無駄もでかいし
メモリ空間異なるところもっていくときに全部作り直しだし
昨今はむしろ使えないデータ構造扱いされること多いから
c/c++を高速化のために使ってるならなおさら
339デフォルトの名無しさん
2020/02/29(土) 16:38:02.22ID:/L84OmpW 長文書いてる人は全員釣り師。
340デフォルトの名無しさん
2020/02/29(土) 16:40:06.91ID:/L84OmpW341デフォルトの名無しさん
2020/02/29(土) 16:45:07.46ID:ZbPwrBbB■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国外務省局長 「ポケットに手を入れていたのは寒いから」 日本との局長級会談で ★2 [お断り★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★7 [ぐれ★]
- 中国、日本行き“50万人”キャンセル 渡航自粛でコロナ禍以来最大 ★3 [お断り★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 [おっさん友の会★]
- 「日本産水産物の市場などない」 中国外務省毛寧報道局長、日本に揺さぶり [蚤の市★]
- 【外交】元台湾総統・馬英九氏、高市首相発言に「台湾を危険にさらす」台湾海峡の問題は「両岸の中国人が自ら話し合うべき」★2 [1ゲットロボ★]
- 【悲報】そういや総理になる前に高市早苗は消費税減税するとか言ってた話どーなったの🥺 [616817505]
- 【実況】博衣こよりのえちえちフログロ学力テスト🧪★5
- エッヂ落ちた?
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- 【街の声】高市人気爆発!野党に怒りの声!! [237216734]
- 【ぺこ専🐰】なんG 兎田ぺこら実況スレ🏡【ホロライブ▶】
