- 1 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 09:05:42.21 ID:mJKRg6iz0.net]
- 次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part133 mevius.5ch.net/test/read.cgi/tech/1511509970/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 mevius.5ch.net/test/read.cgi/tech/1509780815/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
- 48 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 01:55:54.91 ID:B1112Jntd.net]
- ハッシュをソートかあ
- 49 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 03:22:06.75 ID:vIDP+sWr0.net]
- コピーしたくないオブジェクトへのポインタ(ていうか全体をシリアライズするの可能性も考えたらindexがマジお勧め)の配列おソートすれば良い
そういった実装の詳細はクラスの中に隠すことができる 何のためにC++を使っているのやヽ(`Д´)ノ!!!11!1
- 50 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 08:17:39.92 ID:abHZXNlp0.net]
- >>47
なんかモヤモヤするなそれw
- 51 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 11:41:38.50 ID:/ypN0hd6M.net]
- >>39
hashは値に対してユニークじゃないけどいいの?
- 52 名前:デフォルトの名無しさん [2018/01/28(日) 14:41:11.23 .net]
- そりゃハッシュ衝突用のフィールドくらい作ってるだろうよ
質問にないことは心配しなくていいよ
- 53 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 15:09:59.60 ID:RaXbFAH70.net]
- 心配してるんじゃなくてバカにしてるんだよw
- 54 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 15:44:58.16 ID:C2Jb//yt0.net]
- バカにしようとして失敗してるとしか見えないけど w
- 55 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 20:33:36.08 ID:NzqukFwp0.net]
- Impliment.h
class Impliment { public: base; }; Interface.h class Interface {
- 56 名前:デフォルトの名無しさん mailto:sage [2018/01/28(日) 20:42:03.84 ID:NzqukFwp0.net]
- すいません。途中で書き込んでしまいました。
以下のようなクラスを作ったのですが、 derivedがImp::baseを継承しているため、 インクルードの順番が固定されてしまいます。(Impliment.hが先でないといけない) こういったクラスは使う人から見て嫌がられるでしょうか。 ご意見をいただけるとありがたいです。 Impliment.h class Impliment { public: class base {} }; Interface.h template<class Imp> class Interface { private: class derived : public Imp::base {} }
- 57 名前:はちみつ餃子 mailto:sage [2018/01/28(日) 20:56:07.47 ID:Xl/BPHGJ0.net]
- >>55
「XXの実装とインターフェイスが分かれている」ということをユーザが意識しないといけないのは抽象化の不足だと思う。 分離した形のデザインで開発するのはかまわないけど、ユーザに対してはなるべく隠すのが望ましい。 #include<Implement.h> #include<Interface.h> と書いたヘッダファイルを用意しておく程度のことでもだいぶんマシになる。 (インクルードガードはしておくこと)
- 58 名前:デフォルトの名無しさん mailto:sage [2018/01/29(月) 02:50:08.46 ID:gQcv+kbG0.net]
- >>55
普通は interface.h の冒頭で implement.h をインクルードしておく
- 59 名前:デフォルトの名無しさん mailto:sage [2018/01/29(月) 05:39:18.37 ID:+mqzfkB+0.net]
- >>55
このコードだけならインクルード順が逆でも問題ない。
- 60 名前:デフォルトの名無しさん mailto:sage [2018/01/30(火) 20:17:26.27 ID:fsahOVUj0.net]
- レスありがとうございます。
>>56 Implimentは複数あって、ユーザーが選ぶことができる というのを想像して作っていました。 >>57 template化する前はそこでインクルードしていました。 >>58 たしかに、このコードだけでは大丈夫ですね。 正確にはこのコードだけではないので、他に原因があるのかもしれません。 ご指摘ありがとうございます。
- 61 名前:デフォルトの名無しさん mailto:sage [2018/01/30(火) 21:08:08.01 ID:VkcoBYQV0.net]
- Implement入れ替えさせたいならユーザーに適当な所で
template Interface<MyImplement>; って書かせりゃいいだけじゃないの?
- 62 名前:デフォルトの名無しさん mailto:sage [2018/01/30(火) 21:19:19.29 ID:Lbh+cCVN0.net]
- typename imp::base
- 63 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 11:20:04.76 ID:r6E1M8790.net]
- 質問ですが
「このクラスはバイト列としてコピーできる」ということを明らかにするために 明示的にコピーコンストラクタを書くとして、 どう書けば処理系に依存することなくデフォルトのコピーコンストラクタ以上の性能になることを保証できますか (もしくは、「このクラスはバイト列としてコピーできる」ということを明示する構文はありますか)
- 64 名前:片山博文MZ mailto:sage [2018/02/04(日) 11:26:54.06 ID:i7yJvuTcd.net]
- >>62
MyClass(const MyClass&) = default;
- 65 名前:はちみつ餃子 mailto:sage [2018/02/04(日) 11:36:31.71 ID:H9FebDBN0.net]
- デフォルトのコピーコンストラクタはメンバのコピーコンストラクタを起動するので、
そのクラス (に属するオブジェクト) 全体がバイト列としてコピーするわけではない。 trivially copyable class の要件を満たすように書けばバイト列としてコピー可能と保証される。 コンストラクタの書き方だけでは保証できない。
- 66 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 13:04:56.23 ID:WecC8o2P0.net]
- memcpyするコピコンをユーザー定義すればええやん
- 67 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 13:46:35.82 ID:r6E1M8790.net]
- >>63
なるほど「= default;」のありがたみがわかりた >>64 なるほどそれだと安全性の点でイマイチ… バイト列としてそのままリモートPCに送ったりするクラスに誰かが バイト列としてのコピーが可能でないコードを追加したとしても コンパイラで検出する術が無いっぽいように読める
- 68 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 13:47:37.01 ID:r6E1M8790.net]
- 訂正
誤:バイト列としてのコピーが可能でないコード 正:バイト列としてのコピーを不可能にするコード
- 69 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 13:47:46.54 ID:HBpG+TPK0.net]
- >>62
std::is_trivially_copyable<T>がtrueになるように書いて https://cpprefjp.github.io/reference/type_traits/is_trivially_copyable.html トリビアル型とは何かは検索して
- 70 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 13:52:58.38 ID:HBpG+TPK0.net]
- >>66
なおさらtype_traitsで条件に合わなければコンパイルを失敗させればよい
- 71 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 14:08:05.83 ID:r6E1M8790.net]
- >>69
おk
- 72 名前:はちみつ餃子 mailto:sage [2018/02/04(日) 16:47:05.72 ID:H9FebDBN0.net]
- >>65
まあ書こうと思えば書けないことはないが、 やった結果に整合性がとれるかどうかは別問題なのでな……。
- 73 名前:はちみつ餃子 mailto:sage [2018/02/04(日) 17:24:06.38 ID:H9FebDBN0.net]
- 流れをぶった切って質問するんだけど、
配列の一部をとる参照とかって作れない? 実際にはコンパイルが通らないけど、やりたいことはこんな感じ。 int a[3]; int (&b)[2] = static_cast<int (&)[2]>(a);
- 74 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 18:06:17.19 ID:B+seqFts0.net]
- reinterpret_castすれば?
- 75 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 18:22:52.47 ID:HJ1AdVlZ0.net]
- ポインタにして剥がせばいい
- 76 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 18:28:31.26 ID:HBpG+TPK0.net]
- 配列型はポインタではないので途中からとかない
- 77 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 18:55:06.41 ID:i/oNqC3f0.net]
- 一応うまく行ったけど規格で保証された挙動かどうかはよくわからない
https://ideone.com/wVzc6b
- 78 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 19:14:07.38 ID:NcR26d4z0.net]
- でもポインタにしてしまうと困るシチュエーションなんてありうるの?
マクロの中でsizeofしてるとか?
- 79 名前:デフォルトの名無しさん mailto:sage [2018/02/04(日) 20:30:26.18 ID:WecC8o2P0.net]
- >>71
意味わかんねえ どーゆーこと?
- 80 名前:デフォルトの名無しさん mailto:sage [2018/02/05(月) 23:20:37.74 ID:y5vbQcAP0.net]
- メンバのコピーコンストラクタを起動すべきところをmemcpy()しかしない手製コピーコンストラクタで済ませようとしたら破滅が訪れる
MyClass(const MyClass&) = default; なら勝手にやってくれるのでその心配が無いので安心
- 81 名前:デフォルトの名無しさん mailto:sage [2018/02/05(月) 23:28:20.73 ID:QTKEhMlZ0.net]
- しかしまあ >>68 なんていう便利なモノがあるとは
フラフラこういうスレ読んでるのもためになるなあ
- 82 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 07:54:17.35 ID:CtmFRYuD0.net]
- >>79
>>62
- 83 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 08:05:48.85 ID:cp/uvOeq0.net]
- >>62
処理系に依存することなく「
- 84 名前:保証」なんて出来ない
以上 [] - [ここ壊れてます]
- 85 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 08:27:38.08 ID:rGp9SuaC0.net]
- >>63で解決している
もしくは以下への回答も>>69で出ている
- 86 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 09:14:20.61 ID:CtmFRYuD0.net]
- バイト列コピーが = default; なわけねーだろアホ
- 87 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 11:45:28.85 ID:rGp9SuaC0.net]
- よく読め
バイト列コピーでokの保証は>>69 遅くならないコンストラクタの書き方が>>63
- 88 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 11:48:04.39 ID:rGp9SuaC0.net]
- そもそも「どうコンストラクタを書けば」ってのを質問してるんで
バイト列コピーでコンストラクタを書けってのは単に>>65の珍解答に過ぎない
- 89 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 11:51:41.68 ID:CtmFRYuD0.net]
- すまんが日本語でたのむ
- 90 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 11:54:37.03 ID:rGp9SuaC0.net]
- 元の質問>>62は
・処理系に依存せずデフォルトより遅くならないことが保証されているコンストラクタの書き方 もしくは ・バイト列コピーでokと明示する構文 だろ。 前者は>>63 後者は>>68-69
- 91 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 12:36:57.61 ID:CtmFRYuD0.net]
- 元質問: デフォルトのコピーコンストラクタ以上の性能
おまえ: デフォルトより遅くならないこと よく読めをそのまま返す
- 92 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 12:57:03.34 ID:bHMYZ9Vj0.net]
- 以上っていうのは等しいかまたはそれを越えるという意味だぞ
- 93 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 14:01:35.47 ID:rGp9SuaC0.net]
- そもそも memcpy は前者の性能保証も後者の仕様の保証もどちらも満たしてない
仕様が保証されてるなら多分性能的に大丈夫だろうという程度 間違いを認めると死ぬ病気なんだろうからもうこれ以上は言わない。
- 94 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 14:38:54.29 ID:CtmFRYuD0.net]
- バイトコピーでmemcpyより高性能な手段を1つでも例示したらどうなんだ
> 間違いを認めると死ぬ病気なんだろうから ああ、おまえがか
- 95 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 18:18:02.35 ID:cp/uvOeq0.net]
- https://stackoverflow.com/questions/28623895/why-is-memmove-faster-than-memcpy
- 96 名前:62 mailto:sage [2018/02/06(火) 22:02:19.27 ID:MckGyr3K0.net]
- memcpy()より速いコピー手段Xが仮にあったとして
論理的にmemcpy()で済むケースについてコンパイラが提供する デフォルトのコピーコンストラクタがコピー手段Xにならない理由がわからん… 個人的には「=default;」と書いたら最高性能なんなら毎回手でmemcpy()とか書きたくないカンジ
- 97 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 22:06:49.77 ID:CtmFRYuD0.net]
- >>94
class A { public: A() {} A(A const&) { std::cout << "aho"; } }; class B { public: A a; B() = default; }; int main() { B b, c = b; //this will call you. }
- 98 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 22:09:42.68 ID:MckGyr3K0.net]
- >>95は「論理的にmemcpy()で済むケース」では無いからちげう
- 99 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 22:29:22.47 ID:CtmFRYuD0.net]
- だから日本語でたのむって言っただろ
- 100 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 22:29:24.08 ID:MckGyr3K0.net]
- どうした?
訂正はよ
- 101 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 23:07:57.82 ID:hdfY5rL3M.net]
- 間違いを認めて・・・死んだのか?
- 102 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 23:21:41.18 ID:MckGyr3K0.net]
- 仕方ないので漏れが訂正するわ;
ttps://ideone.com/TZnGv4 ↑のコードの (*1)は「=default;」でデフォルトのコピコンの使用を明示 (*2)は手でmemcpy()でコピーするように書いたコピコン 次の条件で試したら(*1)も(*2)も同じコードになったわ x86-64 gcc 7.2 -O2 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra こことかで試せるが保存と公開方法がわからんかったのでideoneを使わせてもろうた ttps://gcc.godbolt.org/ 漏れの国語力ではようわからんが、さすがに多分>>84は間違いなんジャマイカ、
- 103 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 23:34:18.80 ID:Ur4dB7lv0.net]
- Cから来た連中ってどうしてmemcpyやmemset使いたがるんだろうな
- 104 名前:はちみつ餃子 mailto:sage [2018/02/07(水) 04:09:18.59 ID:OAPGz/K+0.net]
- >>76
reinterpret_cast でなければ通らないときはだいたい駄目なときやわ。
- 105 名前:はちみつ餃子 mailto:sage [2018/02/07(水) 04:
]
- [ここ壊れてます]
- 106 名前:22:37.75 ID:OAPGz/K+0.net mailto: >>100
「default がバイト列コピーとは『限らない』」という意味で >>84 は真。 [] - [ここ壊れてます]
- 107 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/07(水) 05:00:09.29 ID:1UF8v8gcM.net]
- 開始アドレス、終了アドレス、サイズが64bit等で割り切れれば
バイトコピーより早いコピーはあるだろうね
- 108 名前:デフォルトの名無しさん [2018/02/07(水) 07:27:28.65 .net]
- 頭のいいコンパイラなら勝手にベクトル処理とかしてくれるんじゃないの?
知らんけど
- 109 名前:デフォルトの名無しさん [2018/02/07(水) 22:28:51.20 ID:MTpdY7NJ0.net]
- "!"!"!MOHYO!"!"!"2"
1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]] 2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL! 3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{ 41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0 .3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end {
- 110 名前:片山博文MZ mailto:sage [2018/02/10(土) 19:52:35.19 ID:x9I4Wn6Pd.net]
- C++では、
int i; for (i = 0; i < 9; ++i) { ... } が、 for (int i = 0; i < 9; ++i) { ... } って書けるのは知っているだろう。( )の中で、変数を宣言できる。 だが、ifやwhileの( )の中で、変数を宣言できることを知らない人は多い。
- 111 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 04:31:12.99 ID:9irhhPDg0.net]
- C++17では
if ( auto v = n; conditions ) { ... } が可能になるし、これからは広がってくれるかのう
- 112 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 06:11:03.22 ID:l3GMmVaq0.net]
- >>108
これホント待ち遠しい
- 113 名前:デフォルトの名無しさん [2018/02/11(日) 17:00:15.07 ID:RGzNlubj0.net]
- それほど待ち遠しいか?
- 114 名前:デフォルトの名無しさん [2018/02/11(日) 17:27:44.93 ID:QA9xO9uU0.net]
- 待ち遠しくない
- 115 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:34:07.64 ID:A61Ds/EIM.net]
- for( ) の制御変数はそのループでしか使わないことが多いから意味あったけど、if( ) でそんなケースはまれだしなぁ
あれば使うけど待ち遠しいって言うほどじゃない気がする
- 116 名前: mailto:sage [2018/02/11(日) 17:36:34.68 ID:bT0HWvJB0.net]
- 理想主義的な文法ですが、実効性はあるのか疑問ですね
- 117 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:40:12.67 ID:KWDwqk940.net]
- 一瞬意図が分からなかったが
()の中が;で区切れるという話?
- 118 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:41:52.24 ID:rD0gl3AiM.net]
- dynamic_castとの組み合わせで使うとかどうよ
- 119 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 19:11:10.58 ID:av7bQMHG0.net]
- 結構あると思うけどね
if(DWORD err = GetLastError(); err != NO_ERROR) この場合NO_ERRORが0だって分かってるから if(DWORD err = GetLastError()) で済むから無意味だけど
- 120 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 19:17:28.82 ID:yo2OB3cP0.net]
- >>116
前者の方が意図が明確だし意味はあると思う
- 121 名前:デフォルトの名無しさん [2018/02/11(日) 20:06:43.52 .net]
- >>116
>if(DWORD err = GetLastError(); err != NO_ERROR) 普通こうやろ if((DWORD err = GetLastError()) != NO_ERROR) 変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと) 複文書けるのは特にメリット感じないわ
- 122 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 20:41:29.80 ID:Ag9E1Urq0.net]
- それ通らんよ
こうだろ DWORD err;
- 123 名前:
if((err = GetLastError()) != NO_ERROR) if内でしか使わないerrが外部に漏れてるのがよろしくないってこと [] - [ここ壊れてます]
- 124 名前:デフォルトの名無しさん [2018/02/11(日) 20:56:03.30 .net]
- >>119
それが通るという変更だと思ってたわ こう書けるPerlのほうがまだ優位性あるね if((my $err = GetLastError()) != NO_ERROR)
- 125 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 22:10:23.49 ID:p+z832PL0.net]
- if(init ; expr)だと初期化と式が関連していなくてもいいので>>120とは違う構文になる
だからこんなのでもよい if(int err = GetLastError(); hoge.aho()) lock_guardもしておける if(std::lock_guard<std::mutex> lock(m); flag) 構造化束縛も使える if(auto [a, b, c] = f(); b > c){ std::cout << "b > c" << std::endl; }
- 126 名前:デフォルトの名無しさん [2018/02/12(月) 12:22:30.52 ID:sATukCOa0.net]
- Cでは名前空間っていうのをすごい扱っていた気がするんだけどC++は名前空間扱うことってないの?
一つのアプリケーションも完成させたことがないど素人の質問ですまんが
- 127 名前:デフォルトの名無しさん mailto:sage [2018/02/12(月) 12:43:48.54 ID:qekpeHDJ0.net]
- >>122
まずは"C"の入門書を読んで、何を見間違えたのかはっきりさせてからにしようか。
- 128 名前:デフォルトの名無しさん mailto:sage [2018/02/12(月) 14:08:57.84 ID:sGdsmrZD0.net]
- 初心者スレに池
- 129 名前:デフォルトの名無しさん [2018/02/12(月) 20:44:41.93 ID:gfcybQxo0.net]
- >>122
気のせい。
- 130 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 00:10:36.10 ID:YGwN9DGw0.net]
- >>122
Cにnamespaceは無いだろ
- 131 名前:はちみつ餃子 mailto:sage [2018/02/13(火) 17:30:20.31 ID:tUR5ZBgZ0.net]
- 構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
- 132 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 17:45:08.06 ID:a1RYP/Gm0.net]
- こんな名前空間もあるね
int x; int main(void) { x = 1; int x; x = 2; { int x; x = 3; } return 0; }
- 133 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 17:55:17.58 ID:Xr6xvVy+M.net]
- それはスコープでは
- 134 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 18:15:03.36 ID:a1RYP/Gm0.net]
- 変数だよ
代入でもあるね
- 135 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 20:09:02.02 ID:NNOtJgpO0.net]
- 謎すぎワロタがそこから上のスコープのxを参照してくれ
- 136 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 20:19:22.41 ID:Za/EZbH7M.net]
- ブロックって言ってる
- 137 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 21:49:01.90 ID:a1RYP/Gm0.net]
- アホばっかり
がっかり
- 138 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 12:08:37.28 ID:Sgd3BwBT0.net]
- std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、 キャッシュのような機能を実装したいのだけど、 C++でそのような仕組みを作れるクラスはないですか?
- 139 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 17:00:44.45 ID:GbCJk+7h0.net]
- 自分で実装するならどうにでもなるだろ
そのための道具は全て標準で揃っている
- 140 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 18:15:51.96 ID:6url8MQd0.net]
- バックグラウンドならスレッド使うしかないんじゃないかな
- 141 名前:デフォルトの名無しさん [2018/02/15(木) 19:13:27.39 ID:CSnzpiZpM.net]
- C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ
- 142 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 19:34:35.63 ID:95vLe5Bi0.net]
- >>137
どんな点が、性格悪い、と思わせるのですか?
- 143 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 20:03:21.73 ID:qihnyYvs0.net]
- それだよそれ
- 144 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 21:14:35.68 ID:MoAPifjS0.net]
- C++は多分チューリング完全だと思う
- 145 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 21:20:32.50 ID:6nYos/bmM.net]
- >>136
要素数が閾値を超えるのは要素が追加される時だからその時に古い奴を削除すりゃいいだけじゃね?
- 146 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 23:50:52.95 ID:fG1U9Z3qM.net]
- >>135
簡単で良いのでサンプルコード書いてもらえませんか?
- 147 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 00:43:14.82 ID:uaG+5sVQ0.net]
- >>135じゃないけどシンプルにいくなら
{ map<key,value> data; // 本来のデータ map<key,list<key>::iterator> lruindex; // list<key> lrulist; // LRUリスト ... // mapと同じインターフェイス } みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい
- 148 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 03:16:29.76 ID:DpsRPWWQ0.net]
- 辞書・線形リスト・2分木を、組み合わせる。Ruby で書くと、
class LRU_hash def initialize (max_size = 3) # ary は、hash に追加・アクセスした順 @hash = {}; @ary = [] @max_size = max_size end def push (key) if @hash.has_key? key # 一旦、要素を削除してから、最後尾に追加しなおす @ary.delete key else if @max_size == @hash.size # 先頭要素を削除してから、最後尾に追加する @hash.delete(@ary.shift) end @hash[key] = true end @ary.push key end def print_buf puts @ary.join ', ' end end ary = ["あ", "a", "あ", "い", "b", "あ", "c"] hash = LRU_hash.new 4 ary.map { |key| hash.push key } hash.print_buf #=> い, b, あ, c
|

|