C++相談室 part151

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

前スレ
C++相談室 part150
https://mevius.5ch.net/test/read.cgi/tech/1584975873/
このスレもよろしくね。
【初心者歓迎】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/ (日本語)

テンプレここまで
2020/06/16(火) 19:21:15.40ID:uOZIHf/t
スレ立てるまでもないスレにも同じようなこと書いたのですがすみません

巨大なファイルを読み込んで書き出すプログラムを書いています
time1, data1-1, data2-1, data3-1......datan-1
time2, data1-2, data2-2, data3-2......datan-2

みたいな構造が延々と続いています

でこれをdataごとに
data1.csv
time1 data1-1
time2 data1-2

ってそれぞれ書き出して分割する感じなんです

vector<ofstream&> files;
for (auto filename : filenames)
{
2020/06/16(火) 19:24:51.88ID:uOZIHf/t
失礼途中で送信してしまいました。

vector<ofstream&> files;
for (auto filename : filenames)
{
ofstream temp(filename, ios::out);
files.push_back(&temp);
}

こんな感じでofstreamの配列を作ってあとはそれぞれにデータを入れていこうとしたのですが
アクセス違反になります。スコープの外に出たらofstreamは勝手にcloseされる?そうなのでそのせいかなと思っています
複数のファイルに対して順々にデータを書いていきそれをループするのってどうしたらいいでしょうか
2020/06/16(火) 19:29:01.32ID:zbVOEmpz
答え分かってんならちゃんと実体を外に持たせなよ
vector<ofstream> files;
for (auto filename : filenames)
{
ofstream temp(filename, ios::out);
files.push_back(std::move(temp));
}
2020/06/16(火) 20:59:11.88ID:i3Et6pFy
通常はO(1)(で見積もっときゃまぁ大きくは外れない)
2020/06/16(火) 22:57:05.95ID:EUOlqdFN
業務でC++やることになりました
どうせなら体系的に学ぼうと思い、本を買おうと思いますがおすすめありますか?
CとC#の経験はあります
Cは組み込み開発での利用に、C#はデザインパターンを少しは活用出来る程度のレベルです
2020/06/16(火) 23:21:49.71ID:yU3B6kSM
>>435
キーの文字数Nはプログラムがビルドしおわったら変わらないのだから実質定数なのであって、
結局O(M)になるのでは…
(任意のxについて x + 定数 < a * xを満たす定数aを見出せるからオーダー表記の約束によりO(M+(定数)) = O(M)ェ、

しかもこの場合のMはデータの個数に比例するとわいえ、一般的はハッシュテーブルなら衝突しない限り
1回のテーブルアクセスで目的のエントリにたどり着くから、実際にはデータの個数÷ハッシュテーブルサイズ(エントリ数)
となるから衝突が無視できる(エントリ選択に統計的に偏りがなく、かつハッシュテーブルサイズが十分おおおきい
ならO(1)と逝って良いキモス、
2020/06/16(火) 23:31:56.61ID:yU3B6kSM
あと1億文字のstring aと10文字のstring bとでハッシュキーを求める手間はどうかというと、
正直にやると文字数に比例するが
うまいことやったら定数にできる
もしくは文字列の構成時に都度ハッシュを更新するようにして、
ハッシュが入用になったときカタが付いている形ににする
2020/06/16(火) 23:44:57.63ID:Z1WD1bfY
そんな事をするなら素直にノードのポインタを持て
と言いたい
2020/06/16(火) 23:56:47.86ID:yU3B6kSM
それではもともとの問題が解決しない
一億文字のstring aがメモリ上に存在するとして、
まったく別の手段で同じ字面の一億文字の文字列bを作ってしまったとする
aはaのノードを指し、
bはbのノードを指す、としたときに、
2つのノードが実は同じ文字列であることを確かめるには、
プログラムが他にあまた生成した10億個の文字列を一つ一つ確かめ、
最長1億文字の比較を行わねば結論が出ない(
ハッシュテーブルなら一瞬で済む
2020/06/16(火) 23:57:59.42ID:yU3B6kSM
訂正orz、
誤: 10億個の文字列
正: 10億個のノードの文字列
2020/06/17(水) 01:21:46.64ID:6+sJE+by
>>440
>N はわかったんだけど、 M もやっぱり最悪ケースの話ってことで合ってる?
>「通常はO(1)」って言ってるし。
ハッシュ値の値の種類が仮に1024個だとすると、
データの個数がMが1024に収まる範囲だと検索時間が増えないのでO(1)と言えます。
しかし、Mが、1024*1024 個になった場合、1つのハッシュ値あたり、1024個の
キーが入ってしまう事になりますので、Mが1024個の時に比べて検索時間は1024倍に
なります。
これも、Mがある範囲内ではO(1)と言えますが、Mが極端に大きいと、やはり、O(M)となりますね。
2020/06/17(水) 02:05:09.95ID:6+sJE+by
補足しておくと、>>435
>ハッシュを遣わなくて単純に比較した場合は、
>O(MN)
と書きましたが、ハッシュを使わない場合でもキーがランダムに近い場合、ここまで悪くなくて
検索時間は、O(M) 程度で済みます。
なぜかというとキーの文字数Nが長くなっても、比較は先頭の方の文字をいくつか調べる
だけで異なることが分かってしまうことが多いためです。
少し複雑ですが、この事情は、文字数Nを大きくしても余り変わりませんが、
Nを固定して、データの個数Mを大きくしていった場合、だんだんと文字列を長く調査しないと
判断が付かないケースが増えてきます。
そのため、O(M^2)のような傾向が出てくるはずです。
ただし、これは、ハッシュを使わない場合で、かつ、キーがランダムの場合です。
2020/06/17(水) 06:19:39.75ID:y8i+/mqG
>>441
識別子に使えない文字が含まれているが
本当にアクセス違反まで行ったのか?
コンパイルが通らないはずだぞ
2020/06/17(水) 06:22:30.70ID:y8i+/mqG
>>442
左辺値参照を何だと思っている?
&tempは左辺値参照に渡せないし
tempを左辺値参照に渡したところで
forのブレースを抜けるたびにtempのdurationが満了していて
破棄済みのオブジェクト痕跡への参照になるだけだ
2020/06/17(水) 06:25:00.03ID:3yTyzYma
読み違えてたスマンコorz
キーというのは検索する文字列そのものを指していたのかそうか…。n_

一方>>446-447
 キー = ハッシュキー
 ハッシュ = ハッシュキー
 N = ハッシュキーの長さ
の意味で書いていた、、、。...n_
2020/06/17(水) 08:27:10.85ID:y8i+/mqG
つーかそれ以前の問題で左辺値参照はdefault constructibleでないので
そもそもvectorの要素になれない
2020/06/17(水) 10:02:38.14ID:Q2+1ZVNa
>>443
凄い。しっかり動きました。ありがとうございます。
moveのこと全然理解できてないんで勉強します。
458デフォルトの名無しさん
垢版 |
2020/06/17(水) 10:38:40.12ID:GES6ctGC
富豪ですね判ります
2020/06/17(水) 11:38:12.26ID:3iRpcXWU
>>456
今の C++ (C++11 以降) だと vector の要素に求める要件 (requirements) の中に DefaultConstructible は無いよ。
各メンバ関数 (コンストラクタも含む) の要件として要素が DefaultConstructible であることを要求するものはあるけど。

アロケータの方の要件で参照はダメってことになってるみたいなんで参照が駄目には違いないんだけど、
DefaultConstructible でないというのは直接の理由ではない。
2020/06/17(水) 11:50:02.38ID:yIGLezdW
&&はテンプレートでは左辺にも右辺にもなる
2020/06/17(水) 13:02:53.13ID:6+sJE+by
>>452
すみません、
>そのため、O(M^2)のような傾向が出てくるはずです。
これは忘れてください。
ハッシュを使わない場合の話ですが、Mが大きくなってもこのような傾向は出ず、
O(M)のままだと思われます。
なぜなら、同じハッシュ値に属するそれぞれのキーと、与えられたキーとの完全一致を
検査する際、何文字目で一致し無い事が分かるかについては、データの個数Mが大きく
なっても、その期待値は変化しないと考えられるためです。
つまり、完全一致検査時に、個々のキーとの完全一致検査をループして行う時、
1つずつのキーと与えられたキーとが一致し無い事が分かるまでに検査が必要な
先頭からの文字数の平均値は、データの個数が多くなっても変化しないと考えられます。
そのため、この検査に必要なトータル時間は、α・M のようになり、
αが定数になるため、記号で書けば O(M) となります。
462デフォルトの名無しさん
垢版 |
2020/06/19(金) 05:28:33.37ID:LA4wBl0H
windowsのフラットデザインのほうのuiですが、これがC#というやつですか?すごく起動が遅い
2020/06/19(金) 09:08:14.85ID:rQKhbTAp
>>462
uwpかwpf
言語はあまり関係ないない
あとスレチ
464デフォルトの名無しさん
垢版 |
2020/06/19(金) 09:47:56.41ID:LA4wBl0H
どうもです

>>463
guiが重いということですかね
2020/06/19(金) 23:16:25.19ID:c7VHi+F3
C++の仕様になぜGUIがない
言語が強制すればOSが統一できるのに
2020/06/19(金) 23:21:04.03ID:0XxGPvOp
幻想だよ
2020/06/20(土) 01:10:58.81ID:OUofN66X
>>465
出来ない仕様を作ったら仕様ごと無視されるだけだよ。
C++ はたとえ不格好になっても現実的であることを指向してる。
2020/06/20(土) 01:14:26.54ID:QdbcnniD
GUIなんて流行ですぐ方法論も見た目もかわっちまうからな
20年ぐらい前ならウィンドウに必ずクローズボタンがあるみたいなの
必須だったろうけど、今のGUI設計でそんな前提の設計したら
「脳味噌20年前でとまっとるんか」いわれるのがオチ
スクロールバーとかもどんどん消えてるよな
2020/06/20(土) 01:28:11.81ID:YEdOsyO1
まぁ上っ面をなぞるだけの平凡なGUIでもC++で規定してくれたら嬉しいけどねぇ
OSによらず同じC++のコードだけで簡単なGUIを出せるってなると色々捗る気はする
2020/06/20(土) 02:01:25.69ID:Zc+p+3CN
そろそろ音声ユーザーインターフェイスはよ
2020/06/20(土) 03:39:21.03ID:ASLg4tM8
>>469
初期のJavaみたいなのかな
あれがC++にあったら、確かに便利だわな
2020/06/20(土) 03:43:42.23ID:s3zB5lV1
>>469
絶対駄目。
QtやFlutter、Unoなど、それを生業にしている民間業者がいるんだから、
民業圧迫になる。
2020/06/20(土) 03:44:49.57ID:s3zB5lV1
>>472
C++ BuilderのGUIや、MFC、WinForms、WPFなども売り物だ。
それを統一してしまったら民主主義でも資本主義でもなくなってしまう。
2020/06/20(土) 03:58:41.18ID:s3zB5lV1
もしそんなものを定義してしまったら、処理系を開発する会社が完全なる下請けになるじゃないか。
2020/06/20(土) 06:11:52.19ID:tz6HL6iw
GUIやデータ構造に関しては現行はXMLに統一って流れじゃないかね
当然重くなるけど今はマシンパワーでカバーする感じ
そのうちXMLパーサーがハード化されてストレスなくなるだろうよ
2020/06/20(土) 06:55:31.33ID:8i84u99i
>>472-474
標準って何のためにあると思う?
2020/06/20(土) 07:21:58.33ID:v44POU7a
PythonとC++でI/Oの速度って変わるの?
2020/06/20(土) 08:17:17.83ID:3c7Ygm0n
変わるよ
亀と兎くらい
2020/06/20(土) 08:19:37.12ID:v44POU7a
>>478
システムコール呼ぶだけなのになんで違うん?
2020/06/20(土) 08:25:37.47ID:3c7Ygm0n
ゴールを呼ぶまでに差が生まれる
2020/06/20(土) 09:06:19.16ID:v44POU7a
んな変わらんってことねサンキュー
2020/06/20(土) 10:04:49.91ID:KR8wyXv2
>>469
java の awt レベルでいいから欲しいですねえ
2020/06/20(土) 10:14:39.22ID:huVEvmBy
C++標準でも外部でも良いから簡単な記述で簡素なGUI作れるようになってほしいなあ
2020/06/20(土) 11:25:01.67ID:DAim0Dxd
>>477
測定するのが基本
2020/06/20(土) 11:59:28.75ID:bxmHAIN3
ファイルシステムなんかは事実上ほぼ仕様が枯れてきてるから標準化できたけど
この意味GUIはまだ枯れてないからな
2020/06/20(土) 12:00:20.85ID:p75lHsHl
>>473
中の人?
飯の種がなくなるから新しい技術を導入するなっていうのは流石に賛同得られないぞ
2020/06/20(土) 12:01:02.76ID:bxmHAIN3
エンドユーザーがC++とはアプリの外見のことだなんて誤解するようになるのはやだね
2020/06/20(土) 12:05:52.12ID:u8LBLBzP
既存のどのGUIを基本にするかってだけで宗教論争起こすだろ
2020/06/20(土) 12:10:58.69ID:C5g3kKFk
外見くらい好きに作らせろ
2020/06/20(土) 12:12:20.45ID:6XSjyfFJ
こいうのは一種の中二病だよね
実際やってみれば
細かい制御ができない大雑把仕様

大掛かりなオレオレ仕様で学習が困難
ってなるのがオチ
おっさんになればわかる
2020/06/20(土) 12:17:29.80ID:hTyaQ2gm
>>486
それらの中の人なら>>473みたいな的外れな馬鹿げた主張はしないと思う
2020/06/20(土) 12:25:31.96ID:6XSjyfFJ
可能性あるとしたらwebkitを共通仕様にするって線かな
でかすぎるけどね
2020/06/20(土) 12:35:51.45ID:hTyaQ2gm
フルスペックのGUIフレームワークではなく、ちょっとしたテストやデバッグに役立つ程度の簡素なものでもあると嬉しいんだけどね。
2020/06/20(土) 12:38:41.23ID:s3zB5lV1
>>493
Windows使えや。
2020/06/20(土) 13:10:07.38ID:s3zB5lV1
規格を統一するとgcc/clangのような無料コンパイラと差異がなくなってしまうため、MSはC++を主流サポートから外してしまって結果的にC++は落ち目となった。
GUIまで統一したら、今度こそC++は完全に見捨てられよう。
そうなったらWindows支配も終わるかもしれないが、プログラマには大混乱が起きる。
2020/06/20(土) 13:12:32.66ID:s3zB5lV1
>>495
GUI統一の動きがあっても、MSはサポートせずに、MingWだけがサポートする可能性がある。
Qtも自分のアドバンテージがなくなるのでサポートするわけなかろうし。
clangはAppleなのだからiOSやMacに支障を来たすためサポートしないだろう。
結果、gccだけがサポートする変な仕様として終わる。
2020/06/20(土) 13:18:22.13ID:s3zB5lV1
それに、gccには既にGTKがあり、彼らの中では統一規格になっている。
それが彼らの中では世界標準である。
2020/06/20(土) 13:30:02.11ID:u8LBLBzP
c++ってMSの主流じゃね?
C#の方がおこぼれっぽい
2020/06/20(土) 13:33:04.69ID:aXUmPW3Z
またこのキチガイかよ…
連投する度に頭ん中に新しいお花畑でも作ってんのか?
2020/06/20(土) 13:46:04.14ID:hTyaQ2gm
すでにお花畑に埋もれているんだろう
501デフォルトの名無しさん
垢版 |
2020/06/20(土) 16:36:26.09ID:/Eg/RpNH
カーネルがC#になる。
2020/06/20(土) 18:44:23.71ID:bxmHAIN3
どんどんゴミ化していくWin10の究極奥義か
2020/06/20(土) 20:16:12.65ID:+Wzjt0fO
Win10Update作成者本人もなんで領域がRAWになるかわからないとかいう更新入れたくないよなというか強制だし
2020/06/21(日) 00:11:33.65ID:Rbk+jGca
WSL2だけ欲しいけど2004は怖くて入れられない
505デフォルトの名無しさん
垢版 |
2020/06/21(日) 09:18:33.28ID:KK75twmS
>>475
みんな結局JSON使ってる気がする
2020/06/21(日) 09:36:46.75ID:Pcgk88Ti
XMLは実際に扱ってみればわかるが
自由度が高すぎるが故にパーシングがめっちゃ重い
手作業で変更とかされるとなんだかよくわからない
エラーで読めなくなることがあって難儀することが
まれによくある
タグで括るという無駄の多い構造のため必要な保存
情報のサイズに比してファイルサイズがやたらと
でかくなる
等々ロクなことがない
2020/06/21(日) 09:42:48.12ID:9qR4cBA5
だな
2020/06/21(日) 22:56:51.71ID:WahLA6tX
xmlnsの扱いがめんどい
2020/06/22(月) 12:33:37.61ID:Uhqw9X2e
boost::property_treeで使える範囲にしとくんだろうね。
2020/06/22(月) 12:34:51.35ID:pJzisI2b
N4713のD.8にuncaught_exceptionがあるんだけど、理由はなんで?

>>379が言ってたようなRAIIの話で
if (uncaught_exception()) terminate();
else throw system_error{...};
みたいなことすんなってこと?
2020/06/22(月) 12:54:18.39ID:GQVtnPwK
XMLよりJSONのほうが容量小さくなるが、それでも今作ってるアプリではJSONも容量が大きすぎた
けっきょくCSVに落ち着いたわ
2020/06/22(月) 14:19:48.28ID:fPKoMQb1
>>477
ディスクやネットワークの速度は言語を変えても変わんない
Perlとかの激遅言語だと差が出るかもだけど、数値計算しまくったりするシステムじゃない限りは、言語でものすごい性能の差はでない
2020/06/22(月) 17:24:35.40ID:lBtyUm6f
perlってpythonと比べたら10倍近く速くなかったっけ?
2020/06/22(月) 17:37:29.72ID:KMeLbKpH
時と場合と環境とタイミングとプログラムとコンテキストによる
515デフォルトの名無しさん
垢版 |
2020/06/22(月) 18:03:57.06ID:JXDt+qCb
>>483
Tcl/Tk
516デフォルトの名無しさん
垢版 |
2020/06/22(月) 18:06:29.92ID:JXDt+qCb
>>497
GTKは糞
517デフォルトの名無しさん
垢版 |
2020/06/22(月) 18:08:18.53ID:5VJoOXgM
ティックルティーケーと読むのかと思ったら、ティックルチンコらしいな。
その後出てきたのはグレートチンコと読むんだってな。
518デフォルトの名無しさん
垢版 |
2020/06/22(月) 18:08:47.46ID:JXDt+qCb
>>511
JSONも無駄が多過ぎる
C++ならmsgpack
2020/06/22(月) 20:55:06.18ID:jHNWxnNv
>>518
msgpackは直接人が読み書きできないから別物
個人的にサイズが問題になるならmsgpack使うよりzlibとかで圧縮するわ
2020/06/22(月) 22:32:34.35ID:74ajGcn7
>>510
D.8 にも書いてある通り uncaught_exceptions() で同じことができるので、そっちを使えばいい。
わざわざ消してない実装が多いだろうから、たぶんまだしばらく uncaught_exception() も使えちゃうだろうね。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0619r4.html#3.7
2020/06/22(月) 23:25:55.80ID:xsRfWdvc
まともな実装なら[[deprecated]]付けてるでしょ
2020/06/23(火) 05:40:34.32ID:oj2a+YQY
>>520
再入可能バージョンを使えってことね
thx
2020/06/23(火) 10:14:52.18ID:rAKqcV1b
>>519
msgpackはキーが冗長で、結局圧縮が必要なんだよな
テキストであることのメリットを捨てるにはあまりにも中途半端なフォーマット
2020/06/23(火) 10:47:11.02ID:qPEbpbt+
constなメンバー変数ならpublicにしてもいい?
2020/06/23(火) 10:56:31.49ID:rAKqcV1b
後で実装を変更してその変数が不要になったらどうする?
constだからといって不必要に実装を晒していいことにはならない
あくまで教科書的にはこう答えるしかないが、あとはケースバイケースで判断せよ
2020/06/23(火) 11:38:38.63ID:oj2a+YQY
メンバーにconstはあんまり付けないね
static constとかconstexprにするときくらい
書き込みを制限したいなら、それこそ雪駄と下駄で細かく調節できるから
2020/06/23(火) 19:20:38.55ID:60OAlPGb
個人のコードなら全てstruct、全てpublicで良い
仕事、共同、公開コードなら周りにあわせる
2020/06/23(火) 20:12:57.48ID:4z1R/L6q
ランボーだな
2020/06/23(火) 20:19:23.61ID:60OAlPGb
全て自分のコードなら
ポリシーがしっかりしていれば何の問題もない
2020/06/23(火) 20:22:22.86ID:rl0ysbNQ
そのポリシーの帰結がpublicかstructかということだと思うが
何も考えてないのと変わらない
2020/06/23(火) 20:22:26.04ID:6iuxc80n
個人的には、publicにするかどうかはユーザーがアクセスする情報であるかどうかで決めればいいと思うけど
外から見える必要があるなら公開すればいいし
変数で公開するのが気持ち悪ければIsなんとかのメンバ関数作るとか
逆にユーザーが触れる必要のない情報ならconstだろうが公開すべきではない
2020/06/23(火) 20:24:28.42ID:60OAlPGb
>>530
初心者的発想
2020/06/23(火) 20:24:40.50ID:rl0ysbNQ
正直プライベートメンバーがヘッダーから丸見えなC++の仕様はいかがなものかといつも思っている
2020/06/23(火) 20:25:38.50ID:CqSQN5Gg
ヘッダ提供している時点でユーザーに見せたくないものではないよね

隠したいならもっと本格的にやるわ
2020/06/23(火) 20:25:59.71ID:60OAlPGb
ヘッダと実体に分けなきゃいけないのが欠点だと思う
2020/06/23(火) 20:27:30.62ID:CqSQN5Gg
でもjavaやc#みたいに一緒くたにされると、見辛いことこの上ない
2020/06/23(火) 20:31:20.90ID:Rp8Vr+Lo
>>536
テンプレートは嫌い?
2020/06/23(火) 20:32:52.52ID:sbDHiXI+
>>535
それが分割コンパイルというものなのでは?
2020/06/23(火) 20:34:09.42ID:CqSQN5Gg
templateでも長くなってきたら実装分けるだろ
普通はヘッダからさらにincludeするだけだけど、場合によっては分割コンパイルもする
2020/06/23(火) 21:15:05.81ID:K4mymhGD
>>536
そのためだけにインターフェース作ったりしてる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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