トップページ⇒tech
1001コメント275KB

C++相談室 part85

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/10/09(土) 20:22:35
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0369デフォルトの名無しさん2010/10/21(木) 15:08:34
>>367
全部の頂点が円周上に並んでたら、どの4点を選んでも除外される頂点は存在しない
オーダー的にはただの総当たりと変わらないぞ
0370デフォルトの名無しさん2010/10/21(木) 15:26:41
>>369
最悪のケースを例示するだけじゃ議論の意味は無い
確率や平均ケースとの比較も交えて初めて問題点を議論する価値が生まれる
0371デフォルトの名無しさん2010/10/21(木) 15:46:43
>>364
解説が不親切過ぎるw
サンプルコードに別のイディオム使って複雑化させ過ぎだし。

こっち見るとかなり単純な話なんだが。
http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#AlgebraicHierarchy
0372デフォルトの名無しさん2010/10/21(木) 15:55:37
x軸方向、y軸方向の二通りにソートしてそれぞれ順位をつける
xとyの順位の和が一番少ないものと一番大きいもの
xとyの順位の差が大きいもののなかでx,yの順位が小さいもの
計4点を頂点として4角形としリストから除外
残りの点で上記を繰り返す
0373デフォルトの名無しさん2010/10/21(木) 16:43:04
>>370
計算量について議論するならば最悪のケースは避けては通れない
だからそれを例示するのは十分に意義のある事
0374デフォルトの名無しさん2010/10/21(木) 16:58:46
>>367
単にそれっぽい頂点を見つけるだけなら凸包を求めればいい
凸包なら�Dの完了後定数時間で�Cを開始できるので最終的には適当にやるより速いはず
0375デフォルトの名無しさん2010/10/21(木) 17:30:06
クラスメンバ固定配列の数を取得する時、簡単にテンプレートメタで取得出来ると
思っていたのですがうまくいきませんでした。
代わりの方法でもう対処しましたが、テンプレートメタでクラスメンバ固定配列の数
を取得するにはどうすればいいでしょうか?(興味本位ですが)
0376デフォルトの名無しさん2010/10/21(木) 17:48:56
>>375
「クラスメンバ固定配列の数」とはなんですか?
0377デフォルトの名無しさん2010/10/21(木) 19:04:53
>>374
定数時間では無理じゃね?
0378デフォルトの名無しさん2010/10/21(木) 19:06:54
>>373
その円周上に配置されるケースがどれぐらいの頻度で出るかが問題だろう?
ランダム配置でそうなることなんて無視できるぐらい少ないし
意図的に偏らせてあるならそれは問題だから修正しなくてはならない
「そういうケースがある」ってだけじゃほとんど無意味な情報なのよ
あくまで分布とセットじゃないと議論にならんの
いっぺん統計物理とか統計に関わることを勉強してみなさい
分布無しで語れることなんてほとんど何も無いから
0379デフォルトの名無しさん2010/10/21(木) 19:26:45
C++のgetlineについてなのですが
改行か「。」のどちらかが出てきたら読み込みを終えるようにするにはどうすればいいのでしょうか?

istream& std::getline( istream& is, string& s, Char delimiter )で
delimiterを指定しないとちゃんと改行で止まるのですが、「。」を指定すると改行は無視されてしまいます
0380デフォルトの名無しさん2010/10/21(木) 20:06:53
>>378
起きる確率が低い事象を無視するかどうかはアルゴリズムの開発者が決めることじゃない
利用者である>>360が判断すること
だから最悪の評価を提示するのは意味のある事だよ
クイックソートなんかいい例でしょ?

ついでに言うと、このアルゴリズムだと頂点数が十分に多くてかつ頂点が密集している場合、
凸包に含まれる頂点数が慢性的に"僅かな数"とはなりにくいので、平均でも速くない可能性があるよ
総当たり以外の対案を思い付かないから具体的な評価はできないけど・・・
0381デフォルトの名無しさん2010/10/21(木) 22:19:02
構造体にstaticを付けてprivateの代わりにしようと思いました
しかし、gccに怒られます

構造体をprivateにする方法はありますか?(技術的に興味があるだけ)
0382デフォルトの名無しさん2010/10/21(木) 22:20:31
(;´Д`)?
0383デフォルトの名無しさん2010/10/21(木) 22:21:15
static private struct{};
0384デフォルトの名無しさん2010/10/21(木) 22:24:06
class Hoge
{
struct Gorilla
{
};
};
0385デフォルトの名無しさん2010/10/21(木) 22:24:09
>>381
型名と変数名の区別がつくようになれよ
03863812010/10/21(木) 22:34:01
typedef struct {
std::string s1;
static std::string s2;
} test
0387デフォルトの名無しさん2010/10/21(木) 22:36:42
(;´Д`)?
0388デフォルトの名無しさん2010/10/21(木) 22:44:17
>>360
総当りより少しましな方法。計算量は総当りが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
>>362>>367>>372>>374>>388
ありがとう。想定しているのは点1000個ぐらいで点の更新とこの処理を高速で繰り返し
行ないたい。って状況です
とりあえずレスくれたの参考に簡単なのから作ってみる
プログラミングやりだしてからもっと数学真面目に勉強しておくべきだったと感じるね
0390デフォルトの名無しさん2010/10/22(金) 01:11:37
>>368
例外安全を保証するための定番の書きかたなんだけど、
このコードでは冗長なだけだね。
0391デフォルトの名無しさん2010/10/22(金) 14:27:59
ある数値の入った変数 x, 演算子 + - ~ & | だけを使用して0を作れ。
だたし最も少ない使用数とする。

この問題とけるひといませんか?
0392デフォルトの名無しさん2010/10/22(金) 14:29:16
x-x=0
0393デフォルトの名無しさん2010/10/22(金) 14:30:11
問題間違えました!!!

ある数値の入った変数 x, 演算子 + - ~ & | だけを使用して1を作れ。
だたし最も少ない使用数とする。

この問題とけるひといませんか?
0394デフォルトの名無しさん2010/10/22(金) 14:31:32
>>391
使っていいものをはっきりと頼む。
まぁ、xを二回使っていいなら>392のようにx-xでいいな。
0395デフォルトの名無しさん2010/10/22(金) 14:32:32
xの使用数は何回でも良いですよ。
演算子も何回でも良いです。
0396デフォルトの名無しさん2010/10/22(金) 14:39:30
()は使っちゃダメなの?
0397デフォルトの名無しさん2010/10/22(金) 14:40:12
0はx-xが0になるから使えるから使えるよ
0398デフォルトの名無しさん2010/10/22(金) 14:40:25
宿題スレでやれ
0399デフォルトの名無しさん2010/10/22(金) 14:40:39
いや( )
0400デフォルトの名無しさん2010/10/22(金) 14:41:40
もちろん、いいとも
0401デフォルトの名無しさん2010/10/22(金) 14:42:06
x=1
0402デフォルトの名無しさん2010/10/22(金) 14:42:56
-(x+~x)
又は
-(x|~x)
0403デフォルトの名無しさん2010/10/22(金) 14:45:25
ありがとうございましたwwwwwwwwwww
0404デフォルトの名無しさん2010/10/22(金) 17:31:51
インラインコンストラクタって使います?
0405デフォルトの名無しさん2010/10/22(金) 17:37:57
妙な造語作らないでください
0406デフォルトの名無しさん2010/10/22(金) 22:53:59
>>375
クラスメンバ固定配列って int a[100] とかがクラス内で定義されてるってことか?
その要素数が知りたいってこと?
クラスから返却値として返して通常の配列と同じように扱えばいい気がするけど
それじゃだめなのかな
0407デフォルトの名無しさん2010/10/23(土) 00:10:16
>>406
TMPで…ってことなので
int a[100] があったときに countof<a>::value で配列の要素数が得られる
とかじゃね?
0408デフォルトの名無しさん2010/10/23(土) 01:12:10
>>405
inlineキーワードが付いたコンストラクタ
0409デフォルトの名無しさん2010/10/23(土) 01:27:13
>>407
オレもそのように解釈してるよ
返却値ってのはメタ関数に渡すためにクラスから配列の型をtypedefで渡せってこと
その例でいくとaを渡しても多分無理な気がするから
直接型を渡すしかないんじゃないかな

http://codepad.org/bfeSK7W7
こんなことするよりか要素数を定数で持ったほうが早いとは思うけど
0410デフォルトの名無しさん2010/10/23(土) 11:28:46
放送中
http://www.ustream.tv/channel/boostkansai
0411デフォルトの名無しさん2010/10/23(土) 11:30:26
>>408
今時の処理系ではinlineキーワード自体が無意味。
0412デフォルトの名無しさん2010/10/23(土) 11:44:25
かなり無意味だが要素数はこれでコンパイル時に出るよ
http://codepad.org/3VGxIJXI
0413デフォルトの名無しさん2010/10/23(土) 12:28:46
>>412
それって一応テンプレート関数なんですか?
関数で中カッコがないのは初めて見ました
0414デフォルトの名無しさん2010/10/23(土) 12:48:03
sizeofは返り値の型のみに興味があるから関数を呼ばない、だから実装が存在しなくてもいい
0415デフォルトの名無しさん2010/10/23(土) 13:13:59
>>389
面積を最大にする四角形の各頂点は
与えられた点の中でx座標かy座標が
最大か最小になるんじゃないかな。

感覚的には正しそうだけど、ちゃんと証明
しないといけない。
これが証明できれば候補が極端に絞られるね。
0416デフォルトの名無しさん2010/10/23(土) 13:16:36
>>415
ちがう
0417デフォルトの名無しさん2010/10/23(土) 13:19:19
>>415
0418デフォルトの名無しさん2010/10/23(土) 14:47:59
>>376
配列の要素数ではなく
class xxx{
int a[10]:
char b[20];
long b[30]:
}
この場合の固定配列の数は3です。
まさしく固定配列の数なんです。
0419デフォルトの名無しさん2010/10/23(土) 14:52:09
名前を調べるメタ関数がないから無理
0420デフォルトの名無しさん2010/10/23(土) 15:23:09
そんなの知ってどうするのか気になる
0421デフォルトの名無しさん2010/10/23(土) 16:44:20
>>418の作ったモジュールとリンクすると
配列の宣言数に依存した動きをするのか
なかなか予想できない挙動だなw
0422デフォルトの名無しさん2010/10/23(土) 19:27:07
前方宣言をすると依存関係を減らせるという
記事を読んだのですが、依存関係とは何を指し示しているのですか?
0423デフォルトの名無しさん2010/10/23(土) 19:40:10
どこの記事?
04244222010/10/23(土) 19:45:24
>>423
google先生で適当に検索したサイトなので、覚えていません
スマソ
0425デフォルトの名無しさん2010/10/23(土) 20:30:31
>>422
たとえば、クラス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:51
インクルードするファイルを少しでも減らすといい結果になる場合が多い
0427デフォルトの名無しさん2010/10/23(土) 20:35:25
template <typename T> class A;

class B {
friend ?? ←ココ
};

AがBのprivateメンバにアクセスできるようにしたいのですが、前方宣言したテンプレートクラスを
friend宣言するには、どのように記述すればよいのでしょうか?
0428デフォルトの名無しさん2010/10/23(土) 20:47:54
>>427
http://codepad.org/CMaqow6S
0429デフォルトの名無しさん2010/10/23(土) 20:56:16
ヘッダーファイルをincludeするためだけのヘッダーファイルって良くない?
0430デフォルトの名無しさん2010/10/23(土) 20:57:24
何が?
0431デフォルトの名無しさん2010/10/23(土) 20:57:42
>>429
インクルードする手間を減らす為のもの?
0432デフォルトの名無しさん2010/10/23(土) 20:58:49
そうです。私はライブラリなんかでそういうファイルを作りがちなので
0433デフォルトの名無しさん2010/10/23(土) 21:02:19
そういうことすると
そこに登録されたヘッダーが1つ変わっただけで
全然関係ないところもリビルドされちゃうんじゃないかな
04344222010/10/23(土) 21:03:22
>>425-426
thx
0435デフォルトの名無しさん2010/10/23(土) 22:51:46
>>432
基本はそれでいいんだよ。A.hを使いたいならA.hをインクルードするだけでA.hが使うB.hとかC.hとか自動的にインクルードされるから。使うのが楽
ライブラリなら変更頻度も低いはず。で問題が起きたら別ければいいの
名前がぶつかる→名前空間を使ってください。
ビルド時間が延びる→pimplを使ってヘッダの依存を減らしてください。
0436デフォルトの名無しさん2010/10/24(日) 00:25:43
>>432
ほぼ完成されたライブラリで、ユーザーの利便性のために提供するなら悪くないと思う。
でもそれをライブラリ内でも使うのはやめといたほうがいいよ。
修正→コンパイル→テストのサイクルに悪影響を与える可能性が高いから。
0437デフォルトの名無しさん2010/10/24(日) 00:26:49
常に最小限のインクルードを心がけてる
0438デフォルトの名無しさん2010/10/24(日) 01:40:14
>>433,435,436
ありがとうございます。
0439デフォルトの名無しさん2010/10/24(日) 08:43:07
>>412
こういうクソったれなテクニックが山ほどあるところがC++のクソなところ。
0440デフォルトの名無しさん2010/10/24(日) 09:24:05
Chaos++
0441デフォルトの名無しさん2010/10/24(日) 12:38:14
裏技的なものがあっても使わなければいけないわけじゃないから
それがあるから「クソ」ということも無いだろ
0442デフォルトの名無しさん2010/10/24(日) 12:48:40
これでよくね?これならよく使うね。
template <class T, unsigned N>
inline size_t Elems(T const (&)[N])
{
return N;
}
0443デフォルトの名無しさん2010/10/24(日) 12:49:56
>>442
それではコンパイル時にサイズ取れぬぅ!
0444デフォルトの名無しさん2010/10/24(日) 12:58:12
char配列の参照を返すテンプレートをsizeofするんだよな


constexpr早く来い
0445デフォルトの名無しさん2010/10/24(日) 13:03:31
参照ってポインタサイズじゃないのか
04464442010/10/24(日) 13:05:12
って>>412じゃねーか
よく読まずにレスした結果がこれだよ!
0447デフォルトの名無しさん2010/10/24(日) 15:53:56
クラス内に定義したstatic変数って、静的領域にメモリが確保されるってことでいいでしょうか?
つまり、スタック領域に確保されてしまうと、スタックオーバーフローを起こす可能性があるので、
心配しているんです。
0448デフォルトの名無しさん2010/10/24(日) 15:55:19
なんか勘違いしてるような?
0449デフォルトの名無しさん2010/10/24(日) 15:56:38
とりあえず、クラス内に定義したstatic変数は、どの領域に確保されるかを教えていただければいいんですが。。。
0450デフォルトの名無しさん2010/10/24(日) 16:08:41
static変数をもつclassって動的に使えるのけ?
0451デフォルトの名無しさん2010/10/24(日) 16:08:46
boost::reference_wrapperってなんのためにあるの?

template <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:55
クズどもしかいないようだからいいわ
0453デフォルトの名無しさん2010/10/24(日) 17:12:57
>>451
http://codepad.org/MikKgG1W
0454デフォルトの名無しさん2010/10/24(日) 17:16:46
デストラクタは自分で直接呼び出せるけど、それが必要な場面ってありますか?
0455デフォルトの名無しさん2010/10/24(日) 17:21:28
>>453
あ、普通に参照渡してもコピーされるのね…なんか勘違いしてた
どうもですた
0456デフォルトの名無しさん2010/10/24(日) 17:21:46
>>454
配置new
0457デフォルトの名無しさん2010/10/24(日) 19:06:38
>>455
Java もやってる?Java だと挙動違うから混乱しやすい
0458デフォルトの名無しさん2010/10/24(日) 19:29:59
関数の戻り値以外でポインタを使う場合ってありますか?
0459デフォルトの名無しさん2010/10/24(日) 19:31:31
printfの引数の型を調べてみろ
0460デフォルトの名無しさん2010/10/24(日) 19:33:45
クラス内の別のクラスをメンバとして持たせた場合、
そのメンバのクラスのコンストラクタって実行されますか?
実行されるとしたら、どのタイミングで実行されますか?
0461デフォルトの名無しさん2010/10/24(日) 19:35:15
>>460
クラス内の→クラス内に
が正しいです。
0462デフォルトの名無しさん2010/10/24(日) 19:37:42
やってみたほうがはやくね
0463デフォルトの名無しさん2010/10/24(日) 19:38:57
やったんですが、どうも実行されてない感じなので、確かめたいんです。
0464デフォルトの名無しさん2010/10/24(日) 19:43:43
どんなソース書いたのか晒してみ?
0465デフォルトの名無しさん2010/10/24(日) 19:44:33
実はメンバがポインタだったりしてな
0466デフォルトの名無しさん2010/10/24(日) 19:46:25
DRAW::DRAW()
:now(0),width(0),height(0){}

こんな感じ
0467デフォルトの名無しさん2010/10/24(日) 19:47:43
 こ れ は ひ ど い
0468デフォルトの名無しさん2010/10/24(日) 19:48:57
え?どっかおかしいですか?
■ このスレッドは過去ログ倉庫に格納されています