2011-08-12 47 views
0

這可能很簡單,但我似乎無法在任何地方找到解決方案。這是一個C++問題。基本上,我有一個類與幾個實例。我想在這個類的每個實例中自動檢查一個變量。我無法手動檢查每個實例,因爲它們有幾百個。有人知道怎麼做嗎?比較一個類的每個實例的變量 - C++

爲清楚起見,這裏就是我想實現的確切用法: 我有一個叫房類,它有在其他屬性X和Y. 該播放器還具有屬性X和Y. 我需要對房間的每個實例進行排序,並查找是否有任何匹配球員的座標,然後將數據從該對象中拉出。

乾杯!

+0

你在哪裏存儲你的實例? –

+1

您可以將房間存儲在二維表中嗎?鑑於玩家的位置,你可以立即找到房間。如果你的房間形狀不是矩形,通過將每個房間細分成幾個矩形單元仍然是可能的。 – Jem

回答

1

最初的方法是將所有房間放在一個向量中,然後遍歷向量搜索匹配項。 (即 - 有一個.location()方法返回一個x,y座標,並與玩家的位置進行比較)。

這個線性搜索可能會很慢,所以我會考慮使用類似於kd-tree結構的東西,它專門用於空間搜索。

有一個相當不錯的標準庫狀,基於頭的KD樹容器(即我用了不少,並且已經找到相當不錯的)位置:libkdtree++

1

你可以把所有的std :: map中的房間類,其中的關鍵字是std :: pair(或任何類型的X和Y)。那麼你會得到比矢量解決方案好得多的性能。

+1

+1是一種高效,簡單的解決方案。然而,這裏的侷限性在於,如果玩家不一定在標識房間的特定x,y位置(可以說,你使用房間的質心作爲x,y位置,玩家可能在房間的一個角落房間),因此,必須搜索最接近玩家的質心,而不是確切的x,y點。 – MarkD

0

如果屬性X,Y是不是太「壞」的,那麼你可以將屬性X,Y映射到一個特定的房間

0

你如何存儲Room所有的情況下你都沒有提到。假設你有一個std::vector(或者其他可以迭代的容器),它們被稱爲rooms。您可以使用find_if來查找實例。

struct Finder 
{ 
    Finder(int x, int y) : x_(x), y_(y) {} 

    bool operator()(const Room& room) 
    { 
    return (room.getX() == x_) && (room.getY() == y_); 
    } 
private: 
    int x_; 
    int y_; 
}; 

Finder finder(10, 20); // these are the coordinates you're looking for 

std::vector<Room>::const_iterator it = find_if(rooms.begin(), rooms.end(), finder); 

如果你使用的是支持lambda表達式,或者如果你使用boost編譯器,你可以擺脫Finder結構,並用拉姆達替換它。

0

如果性能問題,那麼你應該尋找空間數據結構,如kd-tree,四叉樹或八叉樹。

相關問題