1
我想在STL中創建std :: map,但比較器取決於某些僅在運行時纔可用的動態值..我該如何做到這一點?例如,我想要的東西看起來像std::map<int, int, Comp(value1, value2)>
。 value1和value2不是這裏比較的數字,它們是某種配置數字。我可以使用動態構建的比較器創建地圖嗎?
我想在STL中創建std :: map,但比較器取決於某些僅在運行時纔可用的動態值..我該如何做到這一點?例如,我想要的東西看起來像std::map<int, int, Comp(value1, value2)>
。 value1和value2不是這裏比較的數字,它們是某種配置數字。我可以使用動態構建的比較器創建地圖嗎?
#include <map>
class Comp
{
public:
Comp(int x, int y) : x(x), y(y) {}
bool operator() (int a, int b) const { /* Comparison logic goes here */ }
private:
const int x, y;
};
int main()
{
std::map<int,float,Comp> m(Comp(value1,value2));
}
這就像一個功能,但在運行時對象的形式。這意味着它可以具有狀態,其中包括運行時配置。你所要做的就是超載operator()
。如果您在類定義中定義了所有成員函數體(如上所述),那麼編譯器可能會嵌入一切,因此性能開銷可以忽略不計。
如果您在編譯時知道value1
和value2
(即,如果它們是編譯時常),你可以使用函數模板代替:
template <int x, int y>
bool compare(int a, int b) { /* Comparison logic goes here */ }
int main()
{
std::map<int,float,compare<value1,value2> > m;
}
的代碼是正確的,但你不t真的指出_why_函子是解決方案。如果使用funtor _type_實例化映射,則可以(在運行時)將函子_object_傳遞給映射構造函數。 – MSalters 2010-10-19 08:40:13
@ MSalters:公平點。我已經稍微更新了我的答案。 – 2010-10-19 10:14:35