C++相談室 part85
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/10/09(土) 20:22:35ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0348デフォルトの名無しさん
2010/10/20(水) 22:31:54VS2010でも通るけど・・・?どっか違うところ間違ってんじゃね?
0349デフォルトの名無しさん
2010/10/20(水) 22:36:45VC10でも通ったぞ
通らないならエラーメッセージくらい書けっての
More C++ Idiomsのいくつかは標準やtr1、0xのライブラリの実装でも
使われてる技法だから、知ってても悪くないと思うけどね
Boostでは当然に使われているものもあるね
0350デフォルトの名無しさん
2010/10/20(水) 22:40:22逆にいうと利点を感じないのは素人の証
0351デフォルトの名無しさん
2010/10/20(水) 22:46:22誰が使うんだよこれっていうイディオムは割とたくさんあると思うぞ
0352デフォルトの名無しさん
2010/10/20(水) 22:47:46インテリセンスはエラー出すけど、コンパイルは通るな。
0353デフォルトの名無しさん
2010/10/20(水) 23:01:26Include Guard Macro とか Non-copyable Mixin とかも?
0354デフォルトの名無しさん
2010/10/20(水) 23:15:220355デフォルトの名無しさん
2010/10/20(水) 23:27:09効率上げるためのイディオムだろう
0356デフォルトの名無しさん
2010/10/20(水) 23:34:320357デフォルトの名無しさん
2010/10/20(水) 23:53:14ライブラリのユーザーだまくらかしてまで制限加えて、果たして効率上がってるのかなぞ
0358デフォルトの名無しさん
2010/10/20(水) 23:59:580359デフォルトの名無しさん
2010/10/21(木) 00:33:53有名な所ではstd::shared_ptrやstd::functionのブーリアンコンテキスト
Boostでは他にもいろんな所で使われてる
0360デフォルトの名無しさん
2010/10/21(木) 01:06:51順に決めていきたいです。
一番大きな四角形を作れる4点→その4点を除いた一番大きな(ry→点が3点以下になるまで繰り返し
みたいな感じ。図で表すとこの画像のような感じで4点の組み合わせを決めたい
何か出来るだけ効率よく4点の組み合わせを選んでいく方法教えてください
ttp://skm.vip2ch.com/-/hirame/hirame123032.png
0361デフォルトの名無しさん
2010/10/21(木) 01:35:13そんな複雑か?
0362デフォルトの名無しさん
2010/10/21(木) 10:13:39どの程度「効率」良くする/なるかは問題の規模に依ると思うが、まず数が少ない
ならその単純なアルゴリズムでも良いんじゃないか?
次に一つ考えられるのは、今のしらみつぶしに脱出条件として、全体の領域を
見て外の点(選ぶ順序は工夫いるかも)からトライしていって、
他の点が全て領域の中に入ったら次へ、と再帰的に
(ただ重なる領域で比較もありうるからしらみつぶしがデフォルトで脱出条件)
真面目に考えてないからもっと賢い方法もあるだろう
もっと色々「改良」考えられるだろうけど、凝った事しだすと
アルゴリズム的にもコーディング的にもミスしやすくなるから問題の規模
と必要性に応じてどこまでするか考えたら?
0363デフォルトの名無しさん
2010/10/21(木) 13:21:500364デフォルトの名無しさん
2010/10/21(木) 13:58:38上記のホームページにあるソースコードのstruct BaseConstructor { BaseConstructor(int=0) {} };
は何の役に立ってるんですか?
0365デフォルトの名無しさん
2010/10/21(木) 14:13:00Number::Number() と区別するのに使われてるみたい。
にしても、キモいコードだな。参照カウンタいっこ無駄になってるし。
こんなごく普通の継承関係( is-a 関係)を「代数的階層」とか
仰々しい名前で呼ぶ意味もわからん。
0366デフォルトの名無しさん
2010/10/21(木) 14:29:390367デフォルトの名無しさん
2010/10/21(木) 14:57:42�@適当なアルゴリズムで最大ではないけど比較的大きい四角形を見つける
�Aその内部の点をすべてひとまず除外する
�B(�@〜�A)を適当な回数繰り返す
�C残った僅かな点で総当りして最大を決める
�D最大の四角形を確定して点を集合から削除する
�E点がなくなるまで繰り返す
0368デフォルトの名無しさん
2010/10/21(木) 14:59:39が全然分からないのですが
なんでoperator=がswapなんですか?
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つまり、スタック領域に確保されてしまうと、スタックオーバーフローを起こす可能性があるので、
心配しているんです。
■ このスレッドは過去ログ倉庫に格納されています