C++相談室 part85
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/10/09(土) 20:22:35ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0369デフォルトの名無しさん
2010/10/21(木) 15:08:34全部の頂点が円周上に並んでたら、どの4点を選んでも除外される頂点は存在しない
オーダー的にはただの総当たりと変わらないぞ
0370デフォルトの名無しさん
2010/10/21(木) 15:26:41最悪のケースを例示するだけじゃ議論の意味は無い
確率や平均ケースとの比較も交えて初めて問題点を議論する価値が生まれる
0371デフォルトの名無しさん
2010/10/21(木) 15:46:43解説が不親切過ぎるw
サンプルコードに別のイディオム使って複雑化させ過ぎだし。
こっち見るとかなり単純な話なんだが。
http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#AlgebraicHierarchy
0372デフォルトの名無しさん
2010/10/21(木) 15:55:37xとyの順位の和が一番少ないものと一番大きいもの
xとyの順位の差が大きいもののなかでx,yの順位が小さいもの
計4点を頂点として4角形としリストから除外
残りの点で上記を繰り返す
0373デフォルトの名無しさん
2010/10/21(木) 16:43:04計算量について議論するならば最悪のケースは避けては通れない
だからそれを例示するのは十分に意義のある事
0374デフォルトの名無しさん
2010/10/21(木) 16:58:46単にそれっぽい頂点を見つけるだけなら凸包を求めればいい
凸包なら�Dの完了後定数時間で�Cを開始できるので最終的には適当にやるより速いはず
0375デフォルトの名無しさん
2010/10/21(木) 17:30:06思っていたのですがうまくいきませんでした。
代わりの方法でもう対処しましたが、テンプレートメタでクラスメンバ固定配列の数
を取得するにはどうすればいいでしょうか?(興味本位ですが)
0376デフォルトの名無しさん
2010/10/21(木) 17:48:56「クラスメンバ固定配列の数」とはなんですか?
0377デフォルトの名無しさん
2010/10/21(木) 19:04:53定数時間では無理じゃね?
0378デフォルトの名無しさん
2010/10/21(木) 19:06:54その円周上に配置されるケースがどれぐらいの頻度で出るかが問題だろう?
ランダム配置でそうなることなんて無視できるぐらい少ないし
意図的に偏らせてあるならそれは問題だから修正しなくてはならない
「そういうケースがある」ってだけじゃほとんど無意味な情報なのよ
あくまで分布とセットじゃないと議論にならんの
いっぺん統計物理とか統計に関わることを勉強してみなさい
分布無しで語れることなんてほとんど何も無いから
0379デフォルトの名無しさん
2010/10/21(木) 19:26:45改行か「。」のどちらかが出てきたら読み込みを終えるようにするにはどうすればいいのでしょうか?
istream& std::getline( istream& is, string& s, Char delimiter )で
delimiterを指定しないとちゃんと改行で止まるのですが、「。」を指定すると改行は無視されてしまいます
0380デフォルトの名無しさん
2010/10/21(木) 20:06:53起きる確率が低い事象を無視するかどうかはアルゴリズムの開発者が決めることじゃない
利用者である>>360が判断すること
だから最悪の評価を提示するのは意味のある事だよ
クイックソートなんかいい例でしょ?
ついでに言うと、このアルゴリズムだと頂点数が十分に多くてかつ頂点が密集している場合、
凸包に含まれる頂点数が慢性的に"僅かな数"とはなりにくいので、平均でも速くない可能性があるよ
総当たり以外の対案を思い付かないから具体的な評価はできないけど・・・
0381デフォルトの名無しさん
2010/10/21(木) 22:19:02しかし、gccに怒られます
構造体をprivateにする方法はありますか?(技術的に興味があるだけ)
0382デフォルトの名無しさん
2010/10/21(木) 22:20:310383デフォルトの名無しさん
2010/10/21(木) 22:21:150384デフォルトの名無しさん
2010/10/21(木) 22:24:06{
struct Gorilla
{
};
};
0385デフォルトの名無しさん
2010/10/21(木) 22:24:09型名と変数名の区別がつくようになれよ
0386381
2010/10/21(木) 22:34:01std::string s1;
static std::string s2;
} test
0387デフォルトの名無しさん
2010/10/21(木) 22:36:420388デフォルトの名無しさん
2010/10/21(木) 22:44:17総当りより少しましな方法。計算量は総当りがO(n^4)、本手法はO(n^3)
指針は、「全ての2点の組について、それら2点を対角とする最大の四角形を求める」
・2点を対角とする最大の四角形の求め方
1. 2点A,Bを結ぶ直線ABを考える
2. ABのそれぞれの側で、ABからの距離が最大となる点C,Dを求める
3. 四角形ACBDがABを対角とする四角形で最大
0389デフォルトの名無しさん
2010/10/22(金) 01:11:26ありがとう。想定しているのは点1000個ぐらいで点の更新とこの処理を高速で繰り返し
行ないたい。って状況です
とりあえずレスくれたの参考に簡単なのから作ってみる
プログラミングやりだしてからもっと数学真面目に勉強しておくべきだったと感じるね
0390デフォルトの名無しさん
2010/10/22(金) 01:11:37例外安全を保証するための定番の書きかたなんだけど、
このコードでは冗長なだけだね。
0391デフォルトの名無しさん
2010/10/22(金) 14:27:59だたし最も少ない使用数とする。
この問題とけるひといませんか?
0392デフォルトの名無しさん
2010/10/22(金) 14:29:160393デフォルトの名無しさん
2010/10/22(金) 14:30:11ある数値の入った変数 x, 演算子 + - ~ & | だけを使用して1を作れ。
だたし最も少ない使用数とする。
この問題とけるひといませんか?
0394デフォルトの名無しさん
2010/10/22(金) 14:31:32使っていいものをはっきりと頼む。
まぁ、xを二回使っていいなら>392のようにx-xでいいな。
0395デフォルトの名無しさん
2010/10/22(金) 14:32:32演算子も何回でも良いです。
0396デフォルトの名無しさん
2010/10/22(金) 14:39:300397デフォルトの名無しさん
2010/10/22(金) 14:40:120398デフォルトの名無しさん
2010/10/22(金) 14:40:250399デフォルトの名無しさん
2010/10/22(金) 14:40:390400デフォルトの名無しさん
2010/10/22(金) 14:41:400401デフォルトの名無しさん
2010/10/22(金) 14:42:060402デフォルトの名無しさん
2010/10/22(金) 14:42:56又は
-(x|~x)
0403デフォルトの名無しさん
2010/10/22(金) 14:45:250404デフォルトの名無しさん
2010/10/22(金) 17:31:510405デフォルトの名無しさん
2010/10/22(金) 17:37:570406デフォルトの名無しさん
2010/10/22(金) 22:53:59クラスメンバ固定配列って int a[100] とかがクラス内で定義されてるってことか?
その要素数が知りたいってこと?
クラスから返却値として返して通常の配列と同じように扱えばいい気がするけど
それじゃだめなのかな
0407デフォルトの名無しさん
2010/10/23(土) 00:10:16TMPで…ってことなので
int a[100] があったときに countof<a>::value で配列の要素数が得られる
とかじゃね?
0408デフォルトの名無しさん
2010/10/23(土) 01:12:10inlineキーワードが付いたコンストラクタ
0409デフォルトの名無しさん
2010/10/23(土) 01:27:13オレもそのように解釈してるよ
返却値ってのはメタ関数に渡すためにクラスから配列の型をtypedefで渡せってこと
その例でいくとaを渡しても多分無理な気がするから
直接型を渡すしかないんじゃないかな
http://codepad.org/bfeSK7W7
こんなことするよりか要素数を定数で持ったほうが早いとは思うけど
0410デフォルトの名無しさん
2010/10/23(土) 11:28:46http://www.ustream.tv/channel/boostkansai
0411デフォルトの名無しさん
2010/10/23(土) 11:30:26今時の処理系ではinlineキーワード自体が無意味。
0412デフォルトの名無しさん
2010/10/23(土) 11:44:25http://codepad.org/3VGxIJXI
0413デフォルトの名無しさん
2010/10/23(土) 12:28:46それって一応テンプレート関数なんですか?
関数で中カッコがないのは初めて見ました
0414デフォルトの名無しさん
2010/10/23(土) 12:48:030415デフォルトの名無しさん
2010/10/23(土) 13:13:59面積を最大にする四角形の各頂点は
与えられた点の中でx座標かy座標が
最大か最小になるんじゃないかな。
感覚的には正しそうだけど、ちゃんと証明
しないといけない。
これが証明できれば候補が極端に絞られるね。
0416デフォルトの名無しさん
2010/10/23(土) 13:16:36ちがう
0417デフォルトの名無しさん
2010/10/23(土) 13:19:190418デフォルトの名無しさん
2010/10/23(土) 14:47:59配列の要素数ではなく
class xxx{
int a[10]:
char b[20];
long b[30]:
}
この場合の固定配列の数は3です。
まさしく固定配列の数なんです。
0419デフォルトの名無しさん
2010/10/23(土) 14:52:090420デフォルトの名無しさん
2010/10/23(土) 15:23:090421デフォルトの名無しさん
2010/10/23(土) 16:44:20配列の宣言数に依存した動きをするのか
なかなか予想できない挙動だなw
0422デフォルトの名無しさん
2010/10/23(土) 19:27:07記事を読んだのですが、依存関係とは何を指し示しているのですか?
0423デフォルトの名無しさん
2010/10/23(土) 19:40:100425デフォルトの名無しさん
2010/10/23(土) 20:30:31たとえば、クラスAを定義している a.h と、Aを使用する b.h があるとする。
b.h で A を使うためには a.h をインクルードすればいいんだが、そうすると a.h を
変更したとき、a.h と b.h をインクルードしているファイル全てに影響が及ぶ。
それらのファイル全てが再コンパイルされるので、コンパイル時間が長くなる。
なので、b.h で a.h をインクルードする代わりに、class A の前方宣言を行う。
#include "a.h" を消して、 class A; という記述を加えるわけだ。
そうすると、a.h を変更しても、b.h やそれをインクルードしているファイルには
影響が及ばなくなり、再コンパイルの時間も短くなる。
0426デフォルトの名無しさん
2010/10/23(土) 20:32:510427デフォルトの名無しさん
2010/10/23(土) 20:35:25class B {
friend ?? ←ココ
};
AがBのprivateメンバにアクセスできるようにしたいのですが、前方宣言したテンプレートクラスを
friend宣言するには、どのように記述すればよいのでしょうか?
0428デフォルトの名無しさん
2010/10/23(土) 20:47:54http://codepad.org/CMaqow6S
0429デフォルトの名無しさん
2010/10/23(土) 20:56:160430デフォルトの名無しさん
2010/10/23(土) 20:57:240431デフォルトの名無しさん
2010/10/23(土) 20:57:42インクルードする手間を減らす為のもの?
0432デフォルトの名無しさん
2010/10/23(土) 20:58:490433デフォルトの名無しさん
2010/10/23(土) 21:02:19そこに登録されたヘッダーが1つ変わっただけで
全然関係ないところもリビルドされちゃうんじゃないかな
0435デフォルトの名無しさん
2010/10/23(土) 22:51:46基本はそれでいいんだよ。A.hを使いたいならA.hをインクルードするだけでA.hが使うB.hとかC.hとか自動的にインクルードされるから。使うのが楽
ライブラリなら変更頻度も低いはず。で問題が起きたら別ければいいの
名前がぶつかる→名前空間を使ってください。
ビルド時間が延びる→pimplを使ってヘッダの依存を減らしてください。
0436デフォルトの名無しさん
2010/10/24(日) 00:25:43ほぼ完成されたライブラリで、ユーザーの利便性のために提供するなら悪くないと思う。
でもそれをライブラリ内でも使うのはやめといたほうがいいよ。
修正→コンパイル→テストのサイクルに悪影響を与える可能性が高いから。
0437デフォルトの名無しさん
2010/10/24(日) 00:26:490438デフォルトの名無しさん
2010/10/24(日) 01:40:14ありがとうございます。
0439デフォルトの名無しさん
2010/10/24(日) 08:43:07こういうクソったれなテクニックが山ほどあるところがC++のクソなところ。
0440デフォルトの名無しさん
2010/10/24(日) 09:24:050441デフォルトの名無しさん
2010/10/24(日) 12:38:14それがあるから「クソ」ということも無いだろ
0442デフォルトの名無しさん
2010/10/24(日) 12:48:40template <class T, unsigned N>
inline size_t Elems(T const (&)[N])
{
return N;
}
0443デフォルトの名無しさん
2010/10/24(日) 12:49:56それではコンパイル時にサイズ取れぬぅ!
0444デフォルトの名無しさん
2010/10/24(日) 12:58:12constexpr早く来い
0445デフォルトの名無しさん
2010/10/24(日) 13:03:310447デフォルトの名無しさん
2010/10/24(日) 15:53:56つまり、スタック領域に確保されてしまうと、スタックオーバーフローを起こす可能性があるので、
心配しているんです。
0448デフォルトの名無しさん
2010/10/24(日) 15:55:190449デフォルトの名無しさん
2010/10/24(日) 15:56:380450デフォルトの名無しさん
2010/10/24(日) 16:08:410451デフォルトの名無しさん
2010/10/24(日) 16:08:46template <class T> void func(T obj);
これに参照を渡せるようにしたいから有るって聞いたんだけど
template <class T> T & ref(T & r) { return r; }
func(ref(obj));
こうしてもfunc<T &>が呼ばれるからいちいちreference_wrapperにしなくてもいいと思うんだけど…
0452デフォルトの名無しさん
2010/10/24(日) 16:10:550453デフォルトの名無しさん
2010/10/24(日) 17:12:57http://codepad.org/MikKgG1W
0454デフォルトの名無しさん
2010/10/24(日) 17:16:460455デフォルトの名無しさん
2010/10/24(日) 17:21:28あ、普通に参照渡してもコピーされるのね…なんか勘違いしてた
どうもですた
0456デフォルトの名無しさん
2010/10/24(日) 17:21:46配置new
0457デフォルトの名無しさん
2010/10/24(日) 19:06:38Java もやってる?Java だと挙動違うから混乱しやすい
0458デフォルトの名無しさん
2010/10/24(日) 19:29:590459デフォルトの名無しさん
2010/10/24(日) 19:31:310460デフォルトの名無しさん
2010/10/24(日) 19:33:45そのメンバのクラスのコンストラクタって実行されますか?
実行されるとしたら、どのタイミングで実行されますか?
0461デフォルトの名無しさん
2010/10/24(日) 19:35:15クラス内の→クラス内に
が正しいです。
0462デフォルトの名無しさん
2010/10/24(日) 19:37:420463デフォルトの名無しさん
2010/10/24(日) 19:38:570464デフォルトの名無しさん
2010/10/24(日) 19:43:430465デフォルトの名無しさん
2010/10/24(日) 19:44:330466デフォルトの名無しさん
2010/10/24(日) 19:46:25:now(0),width(0),height(0){}
こんな感じ
0467デフォルトの名無しさん
2010/10/24(日) 19:47:430468デフォルトの名無しさん
2010/10/24(日) 19:48:57■ このスレッドは過去ログ倉庫に格納されています