エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2017/11/04(土) 16:33:35.07ID:NYxCuvMY749デフォルトの名無しさん
2018/05/10(木) 00:46:37.51ID:hNESkqkP750デフォルトの名無しさん
2018/05/10(木) 12:36:43.93ID:dXwOta4y クラスの練習に文字列クラスっぽいものを作ったんですが
Mystr Mystr::operator=(Mystr &obj){
//左辺に右辺を代入
return *this
}
こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが
関数の戻り値をvoidにする以外でなくす方法はありませんか?
一応コード全文 https://ideone.com/A1iQ3Y
Mystr Mystr::operator=(Mystr &obj){
//左辺に右辺を代入
return *this
}
こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが
関数の戻り値をvoidにする以外でなくす方法はありませんか?
一応コード全文 https://ideone.com/A1iQ3Y
751デフォルトの名無しさん
2018/05/10(木) 12:55:29.56ID:vDlJ/Ca2752デフォルトの名無しさん
2018/05/10(木) 13:00:33.59ID:TqAsciuR Mystr & Mystr::operator=(const Mystr &obj);
753デフォルトの名無しさん
2018/05/10(木) 13:59:44.86ID:dXwOta4y ありがとうございました
戻り値にも参照が使えることを知りませんでした
戻り値にも参照が使えることを知りませんでした
754デフォルトの名無しさん
2018/05/10(木) 14:05:03.21ID:vDlJ/Ca2 >>753
おそらくわかっていると思うけど、ローカル変数や
テンポラリーオブジェクトの参照は返しちゃダメなので注意
ダメな例
T& f() { T a; .....; return a;}
string& g() { string a, b; .....; return a+b;}
おそらくわかっていると思うけど、ローカル変数や
テンポラリーオブジェクトの参照は返しちゃダメなので注意
ダメな例
T& f() { T a; .....; return a;}
string& g() { string a, b; .....; return a+b;}
>>749
はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…
はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…
756はちみつ餃子 ◆8X2XSCHEME
2018/05/10(木) 18:38:04.46ID:RiSXhiCD アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。
機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、
機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。
>>755
動かすための情報を集約しようとしてはしてるよ。
ある程度は動く。
https://github.com/tkmc/486
機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、
機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。
>>755
動かすための情報を集約しようとしてはしてるよ。
ある程度は動く。
https://github.com/tkmc/486
758デフォルトの名無しさん
2018/05/10(木) 20:45:54.69ID:CLWEept/ アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー
スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー
と言うことがわかれば十分な気がする
スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー
と言うことがわかれば十分な気がする
759デフォルトの名無しさん
2018/05/11(金) 00:09:23.84ID:cA/jbwin760デフォルトの名無しさん
2018/05/11(金) 07:04:43.76 薄い本ならコミケで売れや
761デフォルトの名無しさん
2018/05/11(金) 13:11:04.97ID:Mluu9Rs0 アセンブラの前に
まずは変数がどこにどのように確保されるかとか
どのように初期化されるかとか
そっちの方が先だろ
スタティック、スタック、ヒープ
をまず理解する
C++であればvirtual関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で
まずは変数がどこにどのように確保されるかとか
どのように初期化されるかとか
そっちの方が先だろ
スタティック、スタック、ヒープ
をまず理解する
C++であればvirtual関数が呼ばれる仕組みとかも
知ってた方が良い
例外の仕組みは機種依存が大きいのでもうちょっと先で
762デフォルトの名無しさん
2018/05/11(金) 14:03:43.45ID:lM6VzEPt763デフォルトの名無しさん
2018/05/11(金) 15:32:04.47ID:L7FGnh/N >>761
そう。
でもスタックを理解するにはメモリという概念モデルの理解が必要
だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う
セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる
そう。
でもスタックを理解するにはメモリという概念モデルの理解が必要
だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う
セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる
764デフォルトの名無しさん
2018/05/11(金) 16:43:05.52ID:ArEHxDOw Z80からはじめよう。
765デフォルトの名無しさん
2018/05/11(金) 17:23:03.14ID:fUD4+ayW 実用レベルのCで関数ローカル変数がどう実現されてるか、となると
ベースポインタというほぼ専用のレジスタが出てくるからなぁ。
そういえば昔、Cが全然分からない頃にMASMの本を読んだら、
Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって
まったく意味が分からなかったのを思い出した。
高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の
サブルーチンを作るための機能なんだと後になって腑に落ちたけど。
ベースポインタというほぼ専用のレジスタが出てくるからなぁ。
そういえば昔、Cが全然分からない頃にMASMの本を読んだら、
Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって
まったく意味が分からなかったのを思い出した。
高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の
サブルーチンを作るための機能なんだと後になって腑に落ちたけど。
766はちみつ餃子 ◆8X2XSCHEME
2018/05/11(金) 17:39:10.37ID:e+Ei11A7 C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを
「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。
「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。
767デフォルトの名無しさん
2018/05/11(金) 17:48:59.53ID:S57n19k4 Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ
768デフォルトの名無しさん
2018/05/11(金) 19:45:01.89ID:CPfY1M+a 龍芯3号か
マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども
仮想マシンの中間コードを触るのは疑問
仮想マシンの中間コードを触るのは疑問
770デフォルトの名無しさん
2018/05/11(金) 20:52:01.78ID:Mluu9Rs0 PCはPCで面白いし、
8bitは8bitで面白い
8bitは8bitで面白い
771はちみつ餃子 ◆8X2XSCHEME
2018/05/11(金) 20:54:19.03ID:e+Ei11A7 AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。
772デフォルトの名無しさん
2018/05/11(金) 20:56:49.04ID:2EGPeEG9 Donald Knuth の MMIX っていう言語は勉強するとためになりますか?
773デフォルトの名無しさん
2018/05/12(土) 01:53:53.98ID:Cq1QtQw6774デフォルトの名無しさん
2018/05/12(土) 04:35:38.94ID:F7LxnV/h wikipedia の「コールスタック」の項に意外にしっかりした説明あるな
コールスタックって何?スタックフレームってなに?
って人は読んでおくといいと思う。
コールスタックって何?スタックフレームってなに?
って人は読んでおくといいと思う。
775デフォルトの名無しさん
2018/05/12(土) 14:17:18.55ID:CbmhA0Cx メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。
Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。
環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。
(思ってる「だけ」で実行には移さないのだけれどもw
Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。
環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。
(思ってる「だけ」で実行には移さないのだけれどもw
776デフォルトの名無しさん
2018/05/12(土) 14:20:15.63ID:CbmhA0Cx777デフォルトの名無しさん
2018/05/12(土) 15:41:16.04ID:9vavBtpK RISC-Vの方がまだ有用な可能性が
778デフォルトの名無しさん
2018/05/23(水) 19:24:44.84ID:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
AA6VB
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
AA6VB
779デフォルトの名無しさん
2018/05/24(木) 10:45:43.84ID:cPlRxlDn AA6VB
781はちみつ餃子 ◆8X2XSCHEME
2018/05/24(木) 21:49:22.52ID:jqqWnK8Z >>775,780
江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。
今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、
当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。
江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。
今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、
当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。
782デフォルトの名無しさん
2018/05/24(木) 22:04:43.75ID:hqF4m+Xg シフトを使って多倍長計算とか、ZDDとか(クヌースの4巻だけど日本発)
783デフォルトの名無しさん
2018/05/24(木) 23:04:39.55ID:agu/wXZc 浮動小数点の誤差がらみとか、バッファオーバーフローでなんで脆弱になるのかとか、キリがなくなるぞ
784デフォルトの名無しさん
2018/05/25(金) 06:31:49.05ID:ZdzP9wu5 コンパイルとリンクとロードの話とか。
ソースファイルからオブジェクトファイルに変換したときに
どんな情報が残ってどんな情報が消えるか。
オブジェクトファイル群をリンクした段階でまだ確定せずに
実行時のロードで配置されるアドレスのこと、あたり。
ソースファイルからオブジェクトファイルに変換したときに
どんな情報が残ってどんな情報が消えるか。
オブジェクトファイル群をリンクした段階でまだ確定せずに
実行時のロードで配置されるアドレスのこと、あたり。
785デフォルトの名無しさん
2018/05/31(木) 19:40:53.15ID:xDJZQ821 ちょっとCと関係ないですが、コンピュータサイエンティストの人がよくMacを使っているのはなぜですか?
786デフォルトの名無しさん
2018/05/31(木) 19:48:19.66ID:DFMmAXw3 しねばいいのに
>>781
二の補数はあたりまえに書いてもいいとおもうけれども、二の補数以外のものがあることを陽に記述する必要はないんじゃないかな…
二の補数はあたりまえに書いてもいいとおもうけれども、二の補数以外のものがあることを陽に記述する必要はないんじゃないかな…
>>785
Mac はお高いからな…
Mac はお高いからな…
789デフォルトの名無しさん
2018/05/31(木) 22:34:17.78ID:Dy3hGHo2790デフォルトの名無しさん
2018/05/31(木) 22:37:50.13ID:xDJZQ821791デフォルトの名無しさん
2018/05/31(木) 22:42:46.81ID:Dy3hGHo2 当時は無かったな。
MSのセミナーとかもmac+windows多かったよ
MSのセミナーとかもmac+windows多かったよ
792デフォルトの名無しさん
2018/06/02(土) 18:09:00.04ID:YEAzW6Zk ヘッダーファイルについて質問なのです。
ヘッダーファイル内で、 ostream というのを使っているのですが、
#include <iostream>をヘッダーファイル内に記述していません。
エラーが出るだろうと思いつつ、ビルドしてみたらエラーが出ませんでした。
これはどういうからくりでしょうか?
ヘッダーファイル内で、 ostream というのを使っているのですが、
#include <iostream>をヘッダーファイル内に記述していません。
エラーが出るだろうと思いつつ、ビルドしてみたらエラーが出ませんでした。
これはどういうからくりでしょうか?
793デフォルトの名無しさん
2018/06/02(土) 18:23:14.65ID:tlq/OxaF ヘッダファイルの中じゃなくostreamを使っている翻訳単位(cppファイル)の中で最低1回include iostreamされてればOK
794はちみつ餃子 ◆8X2XSCHEME
2018/06/02(土) 18:25:58.96ID:LSJtd55X >>792
他のヘッダファイルで include してて間接的に読み込んでいることになってるってのが、一番ありそうかなぁ。
他のヘッダファイルで include してて間接的に読み込んでいることになってるってのが、一番ありそうかなぁ。
795デフォルトの名無しさん
2018/06/02(土) 18:30:00.66ID:YEAzW6Zk >>793
ありがとうございました。
↓のファイルをビルドするとエラーが出るのですが、何が原因かよく分かりません。
フレンド関数関連だと思います。フレンド関数については全く知らないので、真似して
作っただけです。
Vec.h
http://codepad.org/3ROYH1yq
Vec.cpp
http://codepad.org/f3eSheBS
ありがとうございました。
↓のファイルをビルドするとエラーが出るのですが、何が原因かよく分かりません。
フレンド関数関連だと思います。フレンド関数については全く知らないので、真似して
作っただけです。
Vec.h
http://codepad.org/3ROYH1yq
Vec.cpp
http://codepad.org/f3eSheBS
796デフォルトの名無しさん
2018/06/02(土) 18:30:45.89ID:YEAzW6Zk797デフォルトの名無しさん
2018/06/02(土) 18:34:39.57ID:YEAzW6Zk798デフォルトの名無しさん
2018/06/02(土) 18:46:23.02ID:RQ4rJlvL 定義があればヘッダだけでもオブジェクトファイルに実装はできますよ。
799デフォルトの名無しさん
2018/06/02(土) 18:50:06.69ID:YEAzW6Zk >>798
Vec.h
http://codepad.org/3ROYH1yq
上のVec.hの最初の方の
#include <iostream>
#include <cassert>
削除してもビルドエラーが出ません。
プロジェクトにはVec.hしかない状態でビルドしました。
Vec.h
http://codepad.org/3ROYH1yq
上のVec.hの最初の方の
#include <iostream>
#include <cassert>
削除してもビルドエラーが出ません。
プロジェクトにはVec.hしかない状態でビルドしました。
800はちみつ餃子 ◆8X2XSCHEME
2018/06/02(土) 18:55:56.26ID:LSJtd55X801デフォルトの名無しさん
2018/06/02(土) 19:00:50.14ID:YEAzW6Zk >>800
ありがとうございました。
あともう一つ質問なのですが、ロベールの本に、
「関数を実体化するには呼び出したところからその実装が見える必要があります。」
「つまり、関数テンプレートは宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要があるのです。」
と書いてあります。
クラステンプレートについては同様の記述がないのですが、
クラステンプレートについても宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要がありますか?
ありがとうございました。
あともう一つ質問なのですが、ロベールの本に、
「関数を実体化するには呼び出したところからその実装が見える必要があります。」
「つまり、関数テンプレートは宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要があるのです。」
と書いてあります。
クラステンプレートについては同様の記述がないのですが、
クラステンプレートについても宣言と実装をヘッダファイルとソースファイルに分離して
書くことはできず、すべてヘッダファイルで実装する必要がありますか?
802デフォルトの名無しさん
2018/06/02(土) 19:00:59.43ID:uqsytqRM >>795
このへんの問題かな?
https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)
このへんの問題かな?
https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)
803はちみつ餃子 ◆8X2XSCHEME
2018/06/02(土) 19:06:46.84ID:LSJtd55X >>801
Yes。 テンプレートはヘッダファイルに書く必要がある。
同じ実体 (テンプレート引数も同じなテンプレート) はリンク時に統合されるので、
最終的な実行ファイルに複数の実体があったりはしない。
Yes。 テンプレートはヘッダファイルに書く必要がある。
同じ実体 (テンプレート引数も同じなテンプレート) はリンク時に統合されるので、
最終的な実行ファイルに複数の実体があったりはしない。
804デフォルトの名無しさん
2018/06/02(土) 19:21:25.63ID:YEAzW6Zk805デフォルトの名無しさん
2018/06/02(土) 19:22:03.75ID:YEAzW6Zk806デフォルトの名無しさん
2018/06/03(日) 17:10:25.43ID:XweloLai ヘッダファイルについて質問です。
assert() が使いたいため、「List2.h」内に、以下のように書いたとします。
#pragma once
#include "List.h"
#include <cassert>
実は、「List.h」内にも#include <cassert>が書いてあります。
ヘッダファイルにはすべて#pragma onceを書いているので多重インクルードについて
問題はないと思います。
そこで質問なのですが、「List2.h」内で assert() を使っているため、自分としては、
必要ありませんが、「List2.h」内にも#include <cassert>を書いた方が分かりやす
いのではないかと思いました。
既にインクルードされていてもあえて、#include <> を書くという人はいるのでしょうか?
それとも、既にインクルードされていることに気付いている場合には、できるだけ
#include <> は書かないほうがいいのでしょうか?
assert() が使いたいため、「List2.h」内に、以下のように書いたとします。
#pragma once
#include "List.h"
#include <cassert>
実は、「List.h」内にも#include <cassert>が書いてあります。
ヘッダファイルにはすべて#pragma onceを書いているので多重インクルードについて
問題はないと思います。
そこで質問なのですが、「List2.h」内で assert() を使っているため、自分としては、
必要ありませんが、「List2.h」内にも#include <cassert>を書いた方が分かりやす
いのではないかと思いました。
既にインクルードされていてもあえて、#include <> を書くという人はいるのでしょうか?
それとも、既にインクルードされていることに気付いている場合には、できるだけ
#include <> は書かないほうがいいのでしょうか?
>>806
すでにインクルードされているかどうかは書いているときにはわからない、から書いとく
ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから
ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った
しかしテンプレート関数に assert() が入る場合があるのだから、こういったこともあり得るのかもしれないが、まだ私は体験していない…
すでにインクルードされているかどうかは書いているときにはわからない、から書いとく
ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから
ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った
しかしテンプレート関数に assert() が入る場合があるのだから、こういったこともあり得るのかもしれないが、まだ私は体験していない…
808デフォルトの名無しさん
2018/06/03(日) 17:34:16.61ID:XweloLai >>807
ありがとうございます。
>ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから
>ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った
ここのところがよく理解できないのですが、
List.h にテンプレートクラス List<T> が書いてあって、
List2.h には List<T> を継承したクラス List2<T> が書いてあります。
そして、List.h, List2.h の両方で assert() を使っています。
ありがとうございます。
>ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから
>ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った
ここのところがよく理解できないのですが、
List.h にテンプレートクラス List<T> が書いてあって、
List2.h には List<T> を継承したクラス List2<T> が書いてあります。
そして、List.h, List2.h の両方で assert() を使っています。
810デフォルトの名無しさん
2018/06/03(日) 17:47:06.72ID:XweloLai >>809
ありがとうございました。
また質問で申し訳ないのですが、今度は、全く違う質問になります。
一方向リスト用のセルである Cell<T> というクラスを作りました。
Cell<T> のメンバ変数は、
T data
Cell<T> *next
です。
List<T> には、一方向リストの先頭のセルを指すメンバ変数 Cell<T> *head およびリストに挿入したり、
リストから削除したり、リストのサイズを返したりする様々なメンバ関数があります。
List<T> は一方向リストでしたが、List2<T> は双方向リストにしたいとします。
オブジェクト指向プログラミングでは再利用が重要ということなので、
新たに、双方向リスト用のセルを作るのではなく、 Cell<T> を継承して Cell2<T> というクラスを作ることにします。
Cell2<T> には新たにメンバ変数 Cell<T> *prev を追加します。
List2<T> のほうも List<T> と共通で使えるメンバ関数があるため、再利用したいとします。その場合、気持ちとしては、
List<T> のメンバ変数 Cell<T> *head は無効にして、新たに、 Cell2<T> *head と Cell2<T> *tail をメンバ変数に
したいです。
そして、Cell2<T> に対しても使えるメンバ関数はそのまま使い、双方向リストにしたことにより、より効率的に実装できる
メンバ関数については、オーバーライドしたいです。
上記のようなことをどうやって実現したらよいのか分からないのですが、可能でしょうか?
可能だとして、こういうやり方は非推奨でしょうか?
ありがとうございました。
また質問で申し訳ないのですが、今度は、全く違う質問になります。
一方向リスト用のセルである Cell<T> というクラスを作りました。
Cell<T> のメンバ変数は、
T data
Cell<T> *next
です。
List<T> には、一方向リストの先頭のセルを指すメンバ変数 Cell<T> *head およびリストに挿入したり、
リストから削除したり、リストのサイズを返したりする様々なメンバ関数があります。
List<T> は一方向リストでしたが、List2<T> は双方向リストにしたいとします。
オブジェクト指向プログラミングでは再利用が重要ということなので、
新たに、双方向リスト用のセルを作るのではなく、 Cell<T> を継承して Cell2<T> というクラスを作ることにします。
Cell2<T> には新たにメンバ変数 Cell<T> *prev を追加します。
List2<T> のほうも List<T> と共通で使えるメンバ関数があるため、再利用したいとします。その場合、気持ちとしては、
List<T> のメンバ変数 Cell<T> *head は無効にして、新たに、 Cell2<T> *head と Cell2<T> *tail をメンバ変数に
したいです。
そして、Cell2<T> に対しても使えるメンバ関数はそのまま使い、双方向リストにしたことにより、より効率的に実装できる
メンバ関数については、オーバーライドしたいです。
上記のようなことをどうやって実現したらよいのか分からないのですが、可能でしょうか?
可能だとして、こういうやり方は非推奨でしょうか?
811デフォルトの名無しさん
2018/06/03(日) 20:55:43.49ID:E53R3BDh 一方向・双方向リストの、ソースコードを見た方が速い
繰り返しを表す、C++ iterator みたいな、
抽象クラス・インターフェースでも使っているのだろう
繰り返しを表す、C++ iterator みたいな、
抽象クラス・インターフェースでも使っているのだろう
812デフォルトの名無しさん
2018/06/04(月) 08:19:48.74ID:DAGyu3MW 再利用など考えず
一から好きなように双方向リストを作れ
>オブジェクト指向プログラミングでは再利用が重要
は幻想
この場合で言ったらまったく逆で
もともと何か双方向リストがあって、継承して機能制限をして一方向リストに仕立て上げるなら分かるが
一方向リストを継承して双方向リストにするなどイカれてる
一から好きなように双方向リストを作れ
>オブジェクト指向プログラミングでは再利用が重要
は幻想
この場合で言ったらまったく逆で
もともと何か双方向リストがあって、継承して機能制限をして一方向リストに仕立て上げるなら分かるが
一方向リストを継承して双方向リストにするなどイカれてる
813デフォルトの名無しさん
2018/06/04(月) 09:50:25.37ID:3BCLNr2e >>810
一方向リストと双方向リストでどれ程共通的な処理があるのか知らんけどCellBase<T>に共通的な処理を定義してそれからCell<T>とCell2<T>を継承させるのが普通じゃね?
一方向リストと双方向リストでどれ程共通的な処理があるのか知らんけどCellBase<T>に共通的な処理を定義してそれからCell<T>とCell2<T>を継承させるのが普通じゃね?
814はちみつ餃子 ◆8X2XSCHEME
2018/06/04(月) 13:04:55.31ID:zKvF3SpI どうだろう。
総合的な判断が必要という前提はあるけども、
継承が妥当なときの基準のひとつに「is a 関係であるか?」ってのがあるよね。
XはYの一種であると言えるときはXはYを継承していい。
双方向リストは一方向リストの一種であるかというと、まあ Yes って呼んでいいんじゃないの。
ただ、それで楽に使いまわしが出来るかというとそうでもないこともあるので、楽なように作ればいいよ。
練習でやるのなら、使いまわしは置いてそれぞれを作ってみた上で、
共通な部分を探してデザインしなおしてみるというのもいいんじゃないかな。
クラス定義自体は継承関係を持たずにトレイトの方で性質を定義したりとかいったことも今どきはよくやるし、
将来的にコンセプトが入ったらそっちが主流になるかもしれん。
総合的な判断が必要という前提はあるけども、
継承が妥当なときの基準のひとつに「is a 関係であるか?」ってのがあるよね。
XはYの一種であると言えるときはXはYを継承していい。
双方向リストは一方向リストの一種であるかというと、まあ Yes って呼んでいいんじゃないの。
ただ、それで楽に使いまわしが出来るかというとそうでもないこともあるので、楽なように作ればいいよ。
練習でやるのなら、使いまわしは置いてそれぞれを作ってみた上で、
共通な部分を探してデザインしなおしてみるというのもいいんじゃないかな。
クラス定義自体は継承関係を持たずにトレイトの方で性質を定義したりとかいったことも今どきはよくやるし、
将来的にコンセプトが入ったらそっちが主流になるかもしれん。
815デフォルトの名無しさん
2018/06/04(月) 13:18:55.79ID:K9p9OoRg816デフォルトの名無しさん
2018/06/04(月) 13:19:07.80ID:e7JLMPXe817デフォルトの名無しさん
2018/06/04(月) 13:20:24.25ID:e7JLMPXe818デフォルトの名無しさん
2018/06/04(月) 13:43:52.15ID:3BCLNr2e819デフォルトの名無しさん
2018/06/04(月) 14:30:56.26ID:YRbUwbvV >>810
単方向リストから双方向リストを派生させると、内部構造が違うから相違を埋めるのに面倒臭い事になる
派生した双方向リストから単方向リスト内部のノード列にアクセスできたとしても
単方向リストの状態は単方向でノードが繋がっているのだから双方向リストからどうこうはできない
結局の所、双方向用のノードを単方向用ノードにアップキャストしないと格納できないし、取り出すにはダウンキャストしないといけない
もし何とかして単方向リストに双方向用のノードを双方向に数珠繋ぎ出来たら、そのリストはもう双方向リストだよ
あと、insert()の問題もある、std::forward_listの持つinsert_after()が何故そうなのかは構造的に一目瞭然でしょ
厳密に言えば、std::forward_listはコンテナ要件を満たしていないしな
単方向も双方向もLinked Listとして構造的に似ているが効率的に見ても構造的に見ても別のデータ構造だよ
is-aの関係ですら無いし、再利用ってのはhas-aの関係を考えるべきで、継承は再利用するためのものではないよ
例えば、皆、std::stringをhas-aで利用するよね、std::stackはstd::vectorやstd::listなどのアダプタだよね
単方向リストから双方向リストを派生させると、内部構造が違うから相違を埋めるのに面倒臭い事になる
派生した双方向リストから単方向リスト内部のノード列にアクセスできたとしても
単方向リストの状態は単方向でノードが繋がっているのだから双方向リストからどうこうはできない
結局の所、双方向用のノードを単方向用ノードにアップキャストしないと格納できないし、取り出すにはダウンキャストしないといけない
もし何とかして単方向リストに双方向用のノードを双方向に数珠繋ぎ出来たら、そのリストはもう双方向リストだよ
あと、insert()の問題もある、std::forward_listの持つinsert_after()が何故そうなのかは構造的に一目瞭然でしょ
厳密に言えば、std::forward_listはコンテナ要件を満たしていないしな
単方向も双方向もLinked Listとして構造的に似ているが効率的に見ても構造的に見ても別のデータ構造だよ
is-aの関係ですら無いし、再利用ってのはhas-aの関係を考えるべきで、継承は再利用するためのものではないよ
例えば、皆、std::stringをhas-aで利用するよね、std::stackはstd::vectorやstd::listなどのアダプタだよね
820デフォルトの名無しさん
2018/06/04(月) 16:46:27.38ID:OAwYb5Pt 自分の勉強用だったら、継承した双方向リストクラス作ってみて
「やっぱ普通に作った方が簡単にできたな」って経験をするのもいいと思う
よく「オブジェクト指向はこうだから」って言葉にこだわって面倒くさいことしてる人いるけど
プログラムの基本としては「わかりやすさ」「シンプルさ」こそこだわった方がいいと思うから
将来拡張予定がないプログラムなんかだと無駄な継承しない方がいい
「やっぱ普通に作った方が簡単にできたな」って経験をするのもいいと思う
よく「オブジェクト指向はこうだから」って言葉にこだわって面倒くさいことしてる人いるけど
プログラムの基本としては「わかりやすさ」「シンプルさ」こそこだわった方がいいと思うから
将来拡張予定がないプログラムなんかだと無駄な継承しない方がいい
822はちみつ餃子 ◆8X2XSCHEME
2018/06/05(火) 02:58:20.15ID:l2agtc6/ C++ からクラスが無くなることは無いだろうが、
構成の仕方の流行はだいぶん変わってて、
コンセプトが入ったら一気に再編されるかもしれない。
クラスの継承ってそんなに万能じゃないよ。
構成の仕方の流行はだいぶん変わってて、
コンセプトが入ったら一気に再編されるかもしれない。
クラスの継承ってそんなに万能じゃないよ。
823デフォルトの名無しさん
2018/06/06(水) 12:11:26.28ID:ucySJasT ま、そういうことです
単方向リストを継承して双方向リストにするのは悪手
やってみるまでもなくわかるだろJK
結局ほぼすべてのメソッドを上書きしないといけないから意味ない
しかも一から双方向リストを書いた方が分かりやすいし速い
単方向リストを継承して双方向リストにするのは悪手
やってみるまでもなくわかるだろJK
結局ほぼすべてのメソッドを上書きしないといけないから意味ない
しかも一から双方向リストを書いた方が分かりやすいし速い
824デフォルトの名無しさん
2018/06/06(水) 12:24:14.11ID:ucySJasT この場合、どうしても手抜きしたかったら
大は小を兼ねるの考えで、双方向リストのみを作って
単方向リストを使う場面でも双方向リストを使えばよい
それがベストだろうというアンサーがちらついてるからこそ、余計に
単方向リストを継承して双方向リストってのが悪手に見えるんよなぁ
余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし
単方向リストなどその程度の扱い、必要ない
大は小を兼ねるの考えで、双方向リストのみを作って
単方向リストを使う場面でも双方向リストを使えばよい
それがベストだろうというアンサーがちらついてるからこそ、余計に
単方向リストを継承して双方向リストってのが悪手に見えるんよなぁ
余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし
単方向リストなどその程度の扱い、必要ない
825デフォルトの名無しさん
2018/06/06(水) 15:11:28.97ID:5kytDI4t826デフォルトの名無しさん
2018/06/06(水) 18:07:41.59ID:9YbuVUhL >>824
いやあ、単方向リストはそれはそれで使い道はあると思うよ
大体、キャッシュに載り易くメモリ効率も良いstd::vectorで十分だけど
挿入操作を多用するならstd::listやstd::forward_listの方が良いよね
std::forward_listは、std::listよりも要素N個 x ポインタサイズ分のメモリ消費量を抑えられるし
イテレータを使ってO(1)で連続してpush_back()みたいなことも出来る、pop_back()みたいなことはO(1)で出来ないけどね
必要性を問うよりも、その特徴を理解して適切に効率的に使うことが大事なんじゃないかな
まあ、std::mapやstd::setは使うのを躊躇するけどな
O(log n)で値を取り出せて、イテレータでソートされた要素に順次アクセス可能を売りとするけど、メモリ効率が悪すぎる
他の言語のそれらが大体ハッシュテーブルで実装されているのを見るに連想コンテナはunordered系で十分な気もする
いやあ、単方向リストはそれはそれで使い道はあると思うよ
大体、キャッシュに載り易くメモリ効率も良いstd::vectorで十分だけど
挿入操作を多用するならstd::listやstd::forward_listの方が良いよね
std::forward_listは、std::listよりも要素N個 x ポインタサイズ分のメモリ消費量を抑えられるし
イテレータを使ってO(1)で連続してpush_back()みたいなことも出来る、pop_back()みたいなことはO(1)で出来ないけどね
必要性を問うよりも、その特徴を理解して適切に効率的に使うことが大事なんじゃないかな
まあ、std::mapやstd::setは使うのを躊躇するけどな
O(log n)で値を取り出せて、イテレータでソートされた要素に順次アクセス可能を売りとするけど、メモリ効率が悪すぎる
他の言語のそれらが大体ハッシュテーブルで実装されているのを見るに連想コンテナはunordered系で十分な気もする
827デフォルトの名無しさん
2018/06/06(水) 19:32:54.16ID:ucySJasT 言葉が足りなくて申し訳ない
俺もリンクリストを使うことは有るけど、大概切迫していてカリカリカスタマイズしたいときに使うものだから
汎用のテンプレートのリンクリストを使ったためしがない
一方向リストなら、なおのこと使わない
俺もリンクリストを使うことは有るけど、大概切迫していてカリカリカスタマイズしたいときに使うものだから
汎用のテンプレートのリンクリストを使ったためしがない
一方向リストなら、なおのこと使わない
828デフォルトの名無しさん
2018/06/06(水) 20:16:30.41ID:rNkLMN6z 単方向リストを継承して双方向リストを作ることは無いと思うけど、コンポジットすることはあると思う。
ゼロコストの原則の視点に立つと、単方向リストを実装に流用して、双方向リストを作成するのもあり。
ゼロコストの原則の視点に立つと、単方向リストを実装に流用して、双方向リストを作成するのもあり。
829デフォルトの名無しさん
2018/06/06(水) 20:30:07.38ID:sZLPzbQ0 STLのコンテナにstd::unique_ptr突っ込むと、カスタムアロケーター使えないよな?
830デフォルトの名無しさん
2018/06/06(水) 20:32:29.81ID:sZLPzbQ0 >>826
O(1)で10個挿入したら、O(1)*10なんだから、結局O(N)じゃないの?
O(1)で10個挿入したら、O(1)*10なんだから、結局O(N)じゃないの?
831デフォルトの名無しさん
2018/06/06(水) 20:34:19.38ID:sZLPzbQ0 もしかして、std::unique_ptrを突っ込むのがすでに間違いで、std::anyを使えってことなんだろうか。
832デフォルトの名無しさん
2018/06/06(水) 21:03:14.93ID:9YbuVUhL >>827
std::forward_listとそのイテレータだけでFIFOのQueueを実装できたりするよ
イテレータを介したinsert_after()になるから要素を入れるコストはイテレータのコピー分、std::queueよりも高くなると思うけど
std::queueはstd::dequeかstd::listを利用するから、std::forward_listで実装した方がメモリ使用量は少ない
単方向リストを使用して独自実装した方が低コストに抑えられると思うけどね
まあ、再利用も良し悪しって事だね
std::forward_listとそのイテレータだけでFIFOのQueueを実装できたりするよ
イテレータを介したinsert_after()になるから要素を入れるコストはイテレータのコピー分、std::queueよりも高くなると思うけど
std::queueはstd::dequeかstd::listを利用するから、std::forward_listで実装した方がメモリ使用量は少ない
単方向リストを使用して独自実装した方が低コストに抑えられると思うけどね
まあ、再利用も良し悪しって事だね
833デフォルトの名無しさん
2018/06/06(水) 21:09:23.87ID:9YbuVUhL >>830
ごめん書き方が悪かった、1つの要素の挿入にO(1)って意味ね
Linked Listは、挿入場所への移動にO(n)かかり、挿入にO(1)かかるから
最後の要素を指し示すイテレータを保持してたらpush_back()みたいなことも出来るよって話ね
ごめん書き方が悪かった、1つの要素の挿入にO(1)って意味ね
Linked Listは、挿入場所への移動にO(n)かかり、挿入にO(1)かかるから
最後の要素を指し示すイテレータを保持してたらpush_back()みたいなことも出来るよって話ね
834デフォルトの名無しさん
2018/06/09(土) 00:34:24.48ID:l0w/1aK3 std::array の empty()メソッドって意味があるのか?と最近思ったので質問させてください
arrayは通常 array<int, 固定値>のように宣言してから使うと思うのですが、
empty()メソッドの戻り値は <int, 0> 以外は全てfalseでした。
つまり通常<int,(0より大きい整数)>で宣言して使う場合empty()はfalseしか返ってこない
気がするのですが、このメソッドは意味があるのでしょうか?
arrayは通常 array<int, 固定値>のように宣言してから使うと思うのですが、
empty()メソッドの戻り値は <int, 0> 以外は全てfalseでした。
つまり通常<int,(0より大きい整数)>で宣言して使う場合empty()はfalseしか返ってこない
気がするのですが、このメソッドは意味があるのでしょうか?
835デフォルトの名無しさん
2018/06/09(土) 05:56:11.66ID:nuHHgQUg >>834
テンプレートを使って異なる種類のコンテナに共通に使える処理を書くときに、他のコンテナ達と共通の関数を備えていると都合がいいからかなと思う。
テンプレートを使って異なる種類のコンテナに共通に使える処理を書くときに、他のコンテナ達と共通の関数を備えていると都合がいいからかなと思う。
836デフォルトの名無しさん
2018/06/09(土) 12:31:35.52ID:pc7gEgF8 >>834
そのメンバの存在意味の有無に関わらず、コンテナ要件の1つだからね
他のオブジェクト指向言語でのインターフェイスや抽象クラスを用意していないだけで
コンテナとして共通の要件(インターフェイス)が設けられている
例えば、size()、empty()、begin()、end()など
本来、動的なポリモーフィズムをするためにインターフェイスや抽象クラスを設けるけど
vtableは高コストだから、ゼロオーバーヘッドの原則に則り使用していないのよ
まあ、コンテナ自体STLの1つだからオブジェクト指向的な機能は意識していなかったと思うけどね
余談だが、聞いた所によるとテンプレートって最初マクロで実現しようとしてたらしいね
そのメンバの存在意味の有無に関わらず、コンテナ要件の1つだからね
他のオブジェクト指向言語でのインターフェイスや抽象クラスを用意していないだけで
コンテナとして共通の要件(インターフェイス)が設けられている
例えば、size()、empty()、begin()、end()など
本来、動的なポリモーフィズムをするためにインターフェイスや抽象クラスを設けるけど
vtableは高コストだから、ゼロオーバーヘッドの原則に則り使用していないのよ
まあ、コンテナ自体STLの1つだからオブジェクト指向的な機能は意識していなかったと思うけどね
余談だが、聞いた所によるとテンプレートって最初マクロで実現しようとしてたらしいね
837はちみつ餃子 ◆8X2XSCHEME
2018/06/09(土) 12:50:19.63ID:EdmRUNh7 具体的にコンテナに求められる要求はここでまとめられているので参考になれば。
http://ja.cppreference.com/w/cpp/concept/Container
クラスに求める要求を表現するための機能「コンセプト」は C++ の悲願としてずっと前から温められているのだけれど、
なかなか仕様に入らずに先送りされてるという状況。
http://ja.cppreference.com/w/cpp/concept/Container
クラスに求める要求を表現するための機能「コンセプト」は C++ の悲願としてずっと前から温められているのだけれど、
なかなか仕様に入らずに先送りされてるという状況。
838デフォルトの名無しさん
2018/06/11(月) 16:42:05.03ID:SE5SjeC/ ファイルから読み込んだバイト列の先頭部分を参照して、
それがJPEGファイルなのか、PNGファイルなのか、などを判定したいのですが、
どの程度の判定をすればよいものなのでしょうか。
例えばJPEGファイルなら、先頭3バイトを{0xFF, 0xD8, 0xFF}とmemcmp()で十分なのでしょうか。
それがJPEGファイルなのか、PNGファイルなのか、などを判定したいのですが、
どの程度の判定をすればよいものなのでしょうか。
例えばJPEGファイルなら、先頭3バイトを{0xFF, 0xD8, 0xFF}とmemcmp()で十分なのでしょうか。
839デフォルトの名無しさん
2018/06/11(月) 16:50:15.52ID:9mmiVsnm 十分かどうかは時と場合による
840放置された蟻人間 ◆T6xkBnTXz7B0
2018/06/11(月) 16:51:12.74ID:7op9QnGW 画像ファイルには、過去にいくつか脆弱性が確認されている。使用において、脆弱性の存在が致命的ならば、きちんとチェックすべきだし、
処理スピードを優先するなら、memcmpで十分。
処理スピードを優先するなら、memcmpで十分。
841デフォルトの名無しさん
2018/06/11(月) 17:03:57.96ID:SE5SjeC/ すいません、十分というのは、ファイルの破損や脆弱性関連は置いておいて、
他の形式の正常なファイルも拾ってしまわないかということです。
JPEGの場合、先頭の3バイトを判定すれば、他の正常なファイルが引っかかることはないのでしょうか。
他の形式の正常なファイルも拾ってしまわないかということです。
JPEGの場合、先頭の3バイトを判定すれば、他の正常なファイルが引っかかることはないのでしょうか。
842デフォルトの名無しさん
2018/06/11(月) 17:06:17.81ID:3AghcpDH 中身見ないなら、拡張子でもできそうだが
843デフォルトの名無しさん
2018/06/11(月) 17:12:32.50ID:oqoWhxjw 3バイトをランダムなデータと比較する場合、1/16777216の確率で誤認する
ファイルを最後までパースして、JPEGデータとして読み込めるかどうかチェックするのが確実だが
ファイルを最後までパースして、JPEGデータとして読み込めるかどうかチェックするのが確実だが
844はちみつ餃子 ◆8X2XSCHEME
2018/06/11(月) 17:40:03.88ID:CXPnR3I1 >>841
POSIX には file コマンドがあってファイルの種類を判定できるけど、その実装はヒューリスティックだよ。
参考になるとは思うから読んでみるのもいいんじゃない?
ライセンス的に OK ならそのまま流用してもいいかも。
どの程度の精度で判定すべきかは状況によるので総合的に考えてとしか言えない。
例えば、 jpg ではないファイルが多数ある中から jpg を探すというような状況だったら、
先頭をちょっとだけ読んで jpg っぽかったら全部を読んで詳細に判定するというのでもいい。
ほとんどが jpg なのだったら、いちいち詳細に判定するのは速度的に遅くなるけど、それが許容できるのか、
許容できないのであればどの程度まで緩い判定にしていいのか、バランスの問題。
POSIX には file コマンドがあってファイルの種類を判定できるけど、その実装はヒューリスティックだよ。
参考になるとは思うから読んでみるのもいいんじゃない?
ライセンス的に OK ならそのまま流用してもいいかも。
どの程度の精度で判定すべきかは状況によるので総合的に考えてとしか言えない。
例えば、 jpg ではないファイルが多数ある中から jpg を探すというような状況だったら、
先頭をちょっとだけ読んで jpg っぽかったら全部を読んで詳細に判定するというのでもいい。
ほとんどが jpg なのだったら、いちいち詳細に判定するのは速度的に遅くなるけど、それが許容できるのか、
許容できないのであればどの程度まで緩い判定にしていいのか、バランスの問題。
845デフォルトの名無しさん
2018/06/12(火) 12:54:07.45ID:xDeIiE2o なぜ多数から探すかどうかで判定方法が変わるのか
847デフォルトの名無しさん
2018/06/12(火) 13:15:57.78ID:BvPEMwcC 明らかに一致しない時は瞬時に判断出来る
ヘッダですぐにわかるので
jpgではあるんだけど
非対応フォーマットとか一部化けてて表示出来ないとか
そういう判断が難しい
ヘッダですぐにわかるので
jpgではあるんだけど
非対応フォーマットとか一部化けてて表示出来ないとか
そういう判断が難しい
848デフォルトの名無しさん
2018/06/12(火) 13:34:24.68ID:BvPEMwcC はちみつはJPGを扱ったことが無いってのがよく分かる
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- パワフル女性世界3位に高市首相 米誌フォーブス選出 [蚤の市★]
- 【米FRB】0.25%利下げ決定 3会合連続、雇用下支え [蚤の市★]
- テレ朝本社から社外スタッフの男性が転落し死亡 テレビ朝日がコメント [ひかり★]
- 【S.RIDE】「忘年会の幹事ずるい」 ソニー系配車アプリの広告が物議…… 運営が謝罪「配慮に欠ける不適切な表現」掲出終了に [ぐれ★]
- アイヌ民族の「戸籍簿」がヤフオクで落札 団体「人権無視」と憤り [蚤の市★]
- 「身を切る改革」どこへ? 維新「身内」への公金支出、地方でも続々 [蚤の市★]
- 高市「野党はもう債権とか為替の話はしないで!よく分からないから答えない!」 [884040186]
- 豚汁の弱点
- 人生がつまらんやつ、130円で大根買え。
- 【悲報】教育ママ「ギャオオオオオン!息子が大麻吸ってるのお!!」⇨中3の息子を警察に突き出し全てを終わらせる [455031798]
- 【画像】東京都民「助けて!満員電車もう無理いいぃぃいいぃぃぃいいいいいぃ😭」!!!! [732289945]
- 【堂上隼人】ソフトバンク幹部「よし更生してる」→現在までに逮捕12回、レイプ被害者15人
