ページ 11

std::mapでの検索

Posted: 2009年6月02日(火) 23:01
by MNS
例えば、あるクラス「Life」があります。
Lifeはint型の変数を一つ持っており、
そのLifeの実体が何百個もある時に、
そのint型の変数で、10の要素を持つLifeを
何でもいいから一つ検索したいとします。

検索しやすくするために、Lifeのデータをstd::mapに入れることにし、
また、そのint型の変数は短時間に多く変動するので、
std::mapのキーとして、そのint型の変数のポインタを入れることにしました。
std::map<int*, Life*>
最終的に、このようなデータ構造になったのですが、
ここで、find関数でキーの検索を行おうとすると、
int*の変数を渡さなければいけませんよね?

私が求めているのは値の検索で、アドレスの検索ではありません。
このような状況で、
②find関数で、アドレスではなく値を比較することは可能か
③その他の方法で、なるべく高速に検索するものはあるか
ということを聞きたいです。

わかりにくい文章だとは思いますが、どなたか回答お願いします。

Re:std::mapでの検索

Posted: 2009年6月03日(水) 00:09
by Justy

>find関数で、アドレスではなく値を比較することは可能か

 可能といえば可能です。
[color=#d0d0ff" face="monospace]
struct int_ptr_less
{
bool operator()(const int* l, const int* r) const
{
return (*l < *r);
}
};

std::map<int *, Life *, int_ptr_less> lifeMap;
[/color]

でやりたいことはできるはずです。

 が、std::mapの first側の値は変化しないことが前提となっており、
挿入時の値を元に大小関係を見てツリーを構築しますので、
ポインタにして比較する値を途中で変化させてしまうと、破綻します。



>その他の方法で、なるべく高速に検索するものはあるか

 mapの second側もポインタになっていたことから推測すると、実体は別に管理されており、
mapは検索の為だけである、という認識でいいのでしょうか。

 だとすると、たかだか数百程度ですし実体側のリストを手繰った方がいいかと思います。


 それではどうしても遅い、もっと高速にしないと話にならない、ということであれば
ケースバイケースで高速化は可能だと思いますが、具体的には詳細を聞いたりテストしてみないと
なんともいえません。

Re:std::mapでの検索

Posted: 2009年6月03日(水) 22:04
by MNS
std::mapのキーは変化してはいけないのですね。
SLGのユニット選択の際、クリック地点にユニットがいるかどうか、
std::mapを使えばすばやく調べられるかな、と思ってした質問ですので、
別にそこまで速度は必要ありませんでした。

なので、実体側を直接調べようと思います。
どうもありがとうございました。