C++相談室 part143

■ このスレッドは過去ログ倉庫に格納されています
2019/06/15(土) 13:51:53.57ID:DKQ0QQLH0
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part142
https://mevius.5ch.net/test/read.cgi/tech/1554124625/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://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/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvv:1000:512:----: EXT was configured
2019/06/28(金) 02:18:49.53ID:ahgrWLetr
C++に限らず、プログラムに関連した技術書について議論するスレってある?
他板でも良いが、書き込みが活発な場所が良い

金を持て余してて、「定番中の定番」という技術書をかき集めたいんだ
ランキングなどあったらなお良い
2019/06/28(金) 02:20:52.05ID:5qyojIkBd
アマゾン
2019/06/28(金) 08:26:19.94ID:TdQiUvSj0
>>197
本だけ読んでも何もみにつかない
2019/06/28(金) 10:02:58.07ID:eXqq+/Cl0
>>197
スレじゃなくてリアルで聞け
2019/06/28(金) 10:46:50.38ID:keve5VxiM
昔は推奨本スレとか無かったっけ
過去ログを漁ってみるとか
2019/06/28(金) 12:40:55.68ID:RICIf1Tpr
>>199
質問に対する回答にま〜〜〜〜ったくなってない
お前死ぬほどアタマ悪いだろ
2019/06/28(金) 12:54:03.48ID:eXqq+/Cl0
2chでは模範解答なんだが
2019/06/28(金) 14:42:29.18ID:OObtmMVO0
金持て余してて収集欲のために名著集めたいみたいな話なのに身につく身につかないとか言ってるのは確かにおかしいよ
2019/06/28(金) 15:07:13.61ID:6HQoAkrg0
全然関係ないけどこのスレワッチョイの表示がワッチョイだけなんだな
初めてみた
2019/06/28(金) 15:33:25.35ID:kguIGPYnM
>>204
それこそC++に限らないなら他のスレで聞けばよくね?
2019/06/28(金) 16:02:48.30ID:U9hxi1vj0
各C++コンパイラのシェアってどのくらいなんだろう
Builderとかまだ使ってる人いるのかな
2019/06/28(金) 16:39:19.43ID:fGl1mQ6CM
cppreference.com眺めてりゃわかる
2019/06/28(金) 16:48:57.53ID:mY/mlIwO0
>>207
いるんじゃない。
2019/06/28(金) 16:51:56.00ID:mY/mlIwO0
推定だと、Delphiを含めれば、VC++の10分の一位は、Embarcadero製の
開発環境を使っているらしい。C++とPascalの内訳は分からない。
2019/06/28(金) 18:34:46.13ID:mY/mlIwO0
C++で、マルチプラットフォームで、コンパイラとライブラリを同じ組織が
作っているものは多分、他にない。Qtはライブラリと簡易IDE程度だし。
やはり同じ組織が全てを管理しているのは信頼性において優位。
なお、MSだと、Windowsシェアを根本的に減らす開発環境は存在し得ない。
2019/06/28(金) 18:58:18.67ID:mY/mlIwO0
MSの開発環境で、果たしてMSを脅かすような製品を作れるだろうか。
一見便利に見えても、MS社内にはさらに便利なツールやライブラリがあるのでは。
だから、生産性は常にMSには適わないことになる。MS以外の開発環境を
使えば、あるいはMS社内の生産性を超えることが出来るかもしれない。運がよければ。
2019/06/28(金) 19:16:56.00ID:j8DkSia+H
コマンドライン引数にファイル名を取って、そこに記述されている数値列を vector に格納して、その後その vector に何かするプログラムを作りたいとします。
そのファイルに入ってる数値列が int でも float でも良いとき、 main 関数ってどう書いたら良いのでしょうか。
ただし、数値列の中の全ての数値が同じ型であることは保証します。


int main(int argc, char* argv[]){
 vector<ここに何を入れたら良いか分からないです> v;
 ifstream fin(argv[1]);
 auto tmp;
 while(fin >> tmp) v.push_back(tmp);
 fin.close();
 
 〜 v にしたい処理を書く〜
}
2019/06/28(金) 19:31:18.51ID:eXqq+/Cl0
>auto tmp;
2019/06/28(金) 19:33:04.89ID:iRyUn2/nM
doubleか何かにしとけば
あるいはvariant
2019/06/28(金) 19:35:02.98ID:j8DkSia+H
>>214
vector<auto> って意味ですか?
>>215さんの案とどっちが良いんでしょうか。
思想による?
2019/06/28(金) 19:54:16.23ID:3z/U2tJH0
>>216
auto tmp;なんてありえねーってことだろ
型推論でけへんやん
2019/06/28(金) 20:01:01.82ID:j8DkSia+H
>>217
じゃあそこもどう書くべきか分からないです
2019/06/28(金) 20:08:22.32ID:ZUKGdUen0
根本的にはオートマトンで判定する

IP型 192.56.125.0
小数型 1025.62
整数型 100731
分数型 57/1269

+-の記号も含めて状態遷移図を考えてif文のすごい連なりを作る
単純でしょ
2019/06/28(金) 20:12:43.82ID:ZUKGdUen0
9.7/2.01
ピリオドと/を含むこの文字列を分数と見做して小数にしてしまうかどうかも勝手に決めて言い

2.54/-0.07
これは非常に怪しいけど、負の小数に直してもいい、と決めていい

.565
これはどこからどう見ても小数の0.565に見えるから小数である、としてもいい

00.3
ゼロが重なってるけどだいたい小数だろ、ということにしてもいい
2019/06/28(金) 20:30:23.52ID:j8DkSia+H
>>219
トライ木みたいなものを作るべきということですか?
それとも、トライ木など言わずにもっとシンプルに実装できるのでしょうか
2019/06/28(金) 20:38:09.73ID:OXCJu0Q4a
読み込みの時点で処理をするときの型に変換するだけでは?
2019/06/28(金) 20:41:38.84ID:j8DkSia+H
>>222
>>213のコードで言うと、fin >> tmp の部分が「読み込みの時点」ですよね?
どう変えたら良いですか。

ちなみに、
〜 v にしたい処理を書く〜
というところには int なら int、float なら float 向けの工程が書かれるというつもりです
2019/06/28(金) 21:21:06.58ID:DjhzO0vj0
とりあえずvector<string>に収集してから中身がintかdoubleかcomplexかゆっくり解析すればええやん
2019/06/28(金) 21:23:57.66ID:j8DkSia+H
>>224
皆そんなダサいやり方でやっているのですか?
2019/06/28(金) 21:25:54.60ID:WO9nfxiid
字句解析の方法を勉強しないといけないよ。簡単に言えば文字列を一文字一文字解釈する訳。
2019/06/28(金) 21:27:07.49ID:WO9nfxiid
std::atoiとか、std::strtolなどの関数を使えば字句解析は省略できるけど。
2019/06/28(金) 21:27:59.32ID:WO9nfxiid
std::sscanfっつーのもあるね。
2019/06/28(金) 21:29:46.80ID:eXqq+/Cl0
ださいと思うならプログラミング向いてない
2019/06/28(金) 21:36:20.96ID:4VImPalK0
てか面倒だから全部doubleで読むんじゃダメなの?
2019/06/28(金) 21:41:50.76ID:j8DkSia+H
ハァ〜〜〜ダセェ奴しかいねぇなここは
分かった。自分で勉強するわ
ありがとう
2019/06/28(金) 23:21:16.52ID:XG6P9m/X0
N⊆Z⊆Q⊆R⊆C
2019/06/28(金) 23:59:43.49ID:4xkaC8y70
答えでてんのに何が聞きたいんだこいつ
2019/06/29(土) 00:51:14.21ID:JdKIde9pa
>>233
自分が思うカッコイイやり方があるかと期待してたら、誰も期待に応えてくれなかったということだろう。
周囲の人間が「お前のカッコイイは世間からずれてるぞ(むしろバカっぽいぞ)」と教えてやっても、本人は納得しないのだろう。
2019/06/29(土) 01:06:46.73ID:3pgMwDvE0
C++をPythonかなんかと勘違いしてるんだろう
2019/06/29(土) 01:39:33.69ID:wtFmE/I80
>>196
ストラウストラップのは初心者用って聞いてたからスルーしてた。両方ちょっとチェックしてみるわ感謝
2019/06/29(土) 01:58:15.72ID:RmkpebDX0
typescriptだとint|floatみたいな型指定ができるんだっけ
2019/06/29(土) 02:25:19.40ID:WOkj4PNs0
質問です。weak_ptr<T>とintの双方向マップがやりたかったので

boost::bimap<weak_ptr<T>,int> bm;

とやったらweak_ptrはハッシュにできないのでエラーになりました。よく考えると当たり前ですね。
仕方ないのでとりあえずunordered_mapと組み合わせて

boost::bimap<T*,int> bm;
unordered_map<T*, weak_ptr<T>> um;

この2つをセットで用いてるんですが、なんか不格好というか・・・
もしかして変なことしてますかね自分?
2019/06/29(土) 07:07:52.52ID:TGC7pT1Z0
字句解析しても書かれた数が整数型として扱うべきなのか浮動小数点型として扱うべきなのか
書いてあるのが数だけなら、書いた奴の意図まで常にわかるとは限らん

価域だけが問題ならとりあえずdoubleかlong doubleの数値xとして読んでから
std::numeric_limits<T>::lowest()〜std::numeric_limits<T>::max()にxが収まるような最少の型Tを決定せよ、
みたいな
2019/06/29(土) 07:08:51.86ID:TGC7pT1Z0
訂正
 誤: 価域
 正: 値域
2019/06/29(土) 07:20:56.68ID:vBcvr2/W0
>>237
文字列から直接ぶち込むのは無理でしょ
2019/06/29(土) 08:06:13.25ID:8bAr7lLW0
>>231
隙のないクソ野郎コメントだなw
2019/06/29(土) 08:35:15.39ID:z4L1A7GC0
>>239
Tclが演算するときに整数か浮動小数点か勝手に決めるんだよね。
ファイルからデータ読んできて処理させたら所々不自然な値になると思ったら
整数演算になってたりさ。
型変換関数噛ませばいいだけだけどね。
2019/06/29(土) 09:14:29.25ID:1DstyLuX0
むしろ、整数と浮動小数点の両方のパターンで値を持っておいて、後で必要なときにどっちかを使えばいいだけなのでは?
2019/06/29(土) 09:20:12.61ID:xxikbG460
C++でアライメントを指定してクラスをnewしたい
void* operator new[](std::size_t, std::align_val_t)
なる関数が存在するからこれを使う
しかしnew側では一般的にクラスをどのアライメントでnewすればよいのかは知らない
というよりアライメントを指定すべきかどうかも知らない
こういった場合、例えば普通のnewをprivateにしておいて、
その近くにコメントで16でアライメントを使うこととか書くくらいしかできませんかね?
あるいはstatic klass* Generator()みたいな関数を用意すればよいのか
2019/06/29(土) 09:35:17.38ID:TGC7pT1Z0
>>244
値を保持するだけならdouble(使えるならlong double)の一種類で十分
2019/06/29(土) 09:36:35.93ID:TGC7pT1Z0
>>245
『プログラミング言語C』のmalloc()の実装例を嫁

ていうかそれすら読んでいないのカヨ、というレヴェル
2019/06/29(土) 09:56:05.74ID:XuKJ1prL0
>>245
alignasが目的に合うように見えるが使ったことがないから適切かどうか分からん
2019/06/29(土) 09:59:59.32ID:YSWfxQRJ0
>>245
アライメント指定してるのに、
newがアライメントわからないって意味不明
アライメント指定どこいったんだよ
2019/06/29(土) 10:02:29.39ID:xxikbG460
アライメント指定してnewしてほしいクラスがある時
newする側にそれをどうやって伝えるべきか?という問題です
2019/06/29(土) 10:18:23.37ID:YSWfxQRJ0
__attribute__ ((aligned(x)))
2019/06/29(土) 10:20:28.90ID:TGC7pT1Z0
アライメント指定してnewしてほしいクラスTのoperator new()を
オーバーロードしてaligned_malloc()でも呼ぶようにすれば良い
2019/06/29(土) 10:35:52.45ID:vBcvr2/W0
class C {
public:
    __m512i aa;
    void* operator new(std::size_t n) {
        std::cout << "new" << std::endl;
        return ::operator new(n, std::align_val_t(64));
    }
};

こういうことではなく?
2019/06/29(土) 10:37:05.53ID:1DstyLuX0
>>246
でもそれだと、intとdoubleで別々の処理を書かないといけなくなる。
vector<int>とvector<double>を両方作ってtemplate関数で呼び分ければ処理の記述自体は1つにできるでしょ。
2019/06/29(土) 10:45:25.08ID:cHNlfV280
>>246
整数値のビット数が長いとdoubleじゃダメ
2019/06/29(土) 10:55:17.59ID:TGC7pT1Z0
>>255
12 bitぐらいまけてくれYO、
ていうか10バイトのdoubleを使ったらおk
2019/06/29(土) 10:59:12.33ID:TGC7pT1Z0
>>254
どっちかというとunionベースのクラスの出番かとオモテタ
要素型の方でキャスト演算子を定義するなどして整数型解釈と浮動小数点型解釈に両方対応したら、
コンテナを2種類用意する必要はなくなる
キモス
2019/06/29(土) 11:35:29.00ID:sVUKPNaW0
V言語が出来るからC++なんて誰も使わなくなる
2019/06/29(土) 12:00:09.50ID:V+jAPY2V0
>>250
alignas
2019/06/29(土) 12:03:32.81ID:vBcvr2/W0
>>258
今度こそ本当だろうな?
2019/06/29(土) 12:40:30.78ID:LSTTNlMa0
>>258
流行る要素がない
2019/06/29(土) 13:00:13.77ID:N8jtlPKB0
アライメント指定はとっくに言語に組み込まれてるんだけど…
2019/06/29(土) 13:07:40.29ID:HkzJkYF9a
C++ってハウルの動く城みたいな言語だよね
2019/06/29(土) 13:12:22.27ID:xxikbG460
>>252-253
そういうことですハイ
まあひねくれて変なnew使わなければそれで良さそうっすね

>>259
ありがとうございます
2019/06/29(土) 15:10:49.18ID:TGC7pT1Z0
newを呼び出す側がアライメントサイズを過少に設定しても、
コンパイラはnewしようとする構造体に含まれる全メンバのアライメント要請を把握しているはずなので
>>247式に構造体定義を対策しておけば問題無い配置でポインタを返してくれる気もする(そうすべきなのが道理
が(さもないとARMとかで例外で落ちるコードを簡単に量産できてしまう
newの細かい仕様は知らんのでわからん
2019/06/29(土) 15:31:17.71ID:vBcvr2/W0
そんなに迷うことある?
2019/06/29(土) 16:11:26.09ID:N8jtlPKB0
どっちかというとmallocしたメモリよりスタックで確保した場合に問題なることがある
環境やコンパイルオプションにもよるけど
2019/06/29(土) 16:12:26.58ID:oMQgVAVxM
atoiとかで解析する前後でオーバーフローを検出する方法ってあるの?
2019/06/29(土) 16:15:01.31ID:gccJajeoM
長さでもみとけばいいんじゃないの
2019/06/29(土) 16:19:54.13ID:N8jtlPKB0
>>268
ない
0返すだけ
std::stoi
とか使った方がいい
2019/06/29(土) 16:35:00.54ID:/vAOJE6i0
>>263
でも便利なんだな、実は。
2019/06/29(土) 16:43:49.04ID:ggIuLAhq0
vtableの仕様を標準規格化してれば、もっと便利になっていたのにな。
2019/06/29(土) 17:08:11.53ID:/vAOJE6i0
clangやLLVMって、coff 形式の object file は作れないのかな?
2019/06/29(土) 21:36:10.47ID:TGC7pT1Z0
>>271
いろいろやれるからな
テンプレートみたいな難しい仕組みも標準規格としてきちんと仕様化できる連中が
言語仕様の策定を仕切っているというのが大きい
2019/06/29(土) 22:45:38.89ID:zjX1HUko0
>>238
bimapに比較関数の指定をすればよいだろ
https://wandbox.org/permlink/1Zi4FrORsgQ28P9r
2019/06/30(日) 00:04:22.02ID:ft0B/0dK0
>>274
委員会が入ってきてからは汚くなってる気がする。
むしろ、ずっと昔に入った仕様が使いやすい。
2019/06/30(日) 00:15:31.74ID:DqQWlJNh0
C言語が一番使いやすいからな
278デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/06/30(日) 00:34:51.63ID:UuQw9kvG0
C++はSTLの既存クラスに、新たなメンバ関数を追加できますか? 継承の新クラス作るのはではなく。
javascriptとかは追加できたとおもいます。
2019/06/30(日) 00:43:41.85ID:DqQWlJNh0
無理だからフリー関数作りましょう
2019/06/30(日) 01:56:53.48ID:exYwiLt20
>>277
テンプレートの代替物がプリプロセッサのマクロになってしまうというのが最悪すぐる、
しかしまあそれ以外は同意
ただしスタックに構造体を詰めないK&Rの頃の奴のは除外それは論外
2019/06/30(日) 03:02:40.95ID:xrN+8YHV0
>>275
ありがとうございます。owner_lessを使えばbimapだけで済むとわかり、こんなふうにしてましたが

boost::bimap<boost::bimaps::set_of<weak_ptr<string>, owner_less<weak_ptr<string>>>, int>

unordered_setを使う方法もあるんですね。
しかしググってみると、参照先が消えたらハッシュ値が変わるから駄目だ、少し遅くてもstd::set<weak_ptr>にしとけって意見もあるようです。

https://stackoverflow.com/questions/13695640/how-to-make-a-c11-stdunordered-set-of-stdweak-ptr

まぁ自分で分かってやるなら好きにすればいい感じですかね
2019/06/30(日) 07:01:13.58ID:V2b2ALnu0
昔C++にお世話になってたんだけどその頃はゲームでよく使われる言語だったんだよね
今でもゲーム開発によく使われてるの?
2019/06/30(日) 07:14:28.67ID:CneIN5yy0
>>282
使われていると思う。アメリカのQuoraによれば、本格的な3Dゲームでは、
C#が使われたことは無く、全てC/C++製らしい。
2019/06/30(日) 08:26:27.75ID:VKcFh0qo0
ゲームエンジン自体はC++だけど、購入したエンジンを使って作る場合にはエンジンによって使う言語は変わる
2019/06/30(日) 08:41:33.25ID:V2b2ALnu0
>>283
>>284
3Dゲームとゲームエンジンで使われてるのね
やはり速度とモダンな機能ではまだC++の代替になる言語は無い感じだよね
そういう意味ではRustが最近がんばってるみたいだが
2019/06/30(日) 10:05:11.67ID:ft0B/0dK0
>>285
Rustは、mozillaが開発したから有名なだけ。
実際には広く使われることは無いらしい。

既存の言語から逸脱しすぎた言語は、よっぽど便利でない限りは普及しないらしいよ。
2019/06/30(日) 10:59:26.27ID:xpepSpla0
新言語上げでよくやられてるC++叩きって、書いてる方の知識が98/03で止まってて
「そんなん最近のC++でも出来るし…」ってなる事が多い印象が強い
もちろん新言語の本当に優れてるところもあるんだろうけど、比較するなら比較元もちゃんと勉強しろと言いたい

あと「C++はこんなに危険!」ってどうしようもないクソコードを藁人形に出してきたりな
お前らの新言語の新機能も間違った理解でクソみたいな使い方したら危険だっての
2019/06/30(日) 11:09:37.42ID:BKgyqS0e0
メタではみんなLISPを作りたがるんだけど、表現方法の違いで文法が狂う。
2019/06/30(日) 11:19:26.11ID:HRz15QoR0
そうはいってもRustは良さげなので
コンパイルがVisual C++クラスに瞬時に終わって
Visual Studioクラスの光速で反応するインテリセンスができたらぜひやりたい
変数がデフォルトでimmutableなのがたいへん痺れる、
2019/06/30(日) 11:23:39.34ID:/mKHwNLn0
確かに今のC++の用途で置き換えられる可能性がありそうなのはRust位だな
2019/06/30(日) 11:27:27.66ID:ft0B/0dK0
でもRustは使いたくない。
2019/06/30(日) 11:30:06.24ID:BKgyqS0e0
Rustは情緒的に言って錆びだからな。蓄積使うんですーって感じの命名なのだろう。
2019/06/30(日) 11:39:32.70ID:iTCTHGA20
RustってC++11以降の機能を勉強して
難しすぎると感じた人がやったらすんなり入れるんだよね
でも普通の言語から移った人は何じゃこれってなる
C++11以降に挫折した人のための言語
2019/06/30(日) 13:14:05.13ID:HRz15QoR0
RustでC++ → Rustトランスレータを書いたら勉強になると思うわ
2019/06/30(日) 13:31:27.33ID:BKgyqS0e0
>>294
間にLLVM挟むと公共の福祉になりえます。
2019/06/30(日) 13:54:46.76ID:HRz15QoR0
>>295
ソースコードのコメントやインデントが保持されないのでは…
あと自分自身が使っていない範囲も含めたC++の全機能のトランスレートに対応しようとしたら日が暮れてしまう
2019/06/30(日) 14:03:37.82ID:aHps5PsQM
>>270
遅レスだけどthx。
面倒そうだけど何とかなりそうね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況