2009-07-13 58 views
1

是否有一個數據結構(在STL或boost中可用),它接受兩個參數並將其映射到某個值?類似於雙參數映射的數據結構

例子有:用於以圖表的座標網格返回某些信息或得到一個邊的權重:

coordinate_quadrant(-1,-1)= 3

weight_of(U, v)= 10

象限示例可以用一個簡單的函數來完成,其中包含四個if語句。我主要是尋找一個適合體重例子的例子。我試圖避免創建一個邊類,並將其傳遞給weight_of(Edge edge)函數。

回答

11

您可以使用std :: map < std :: pair < Type1,Type2 >,Type3 >。

0

在後端使用一對整數對象。換句話說,執行映射,但對於這對對象。您無法重寫operator []以接受多個參數,但可以在自定義地圖類上覆蓋運算符 (),以便您可以獲取一些語法糖,例如my_map[row](col) = whatever

1

我會考慮以下選擇:

選項1

的std ::地圖的std ::對<類型1,類型2>作爲密鑰和類型3作爲值

std::map< std::pair< Type1, Type2 >, Type3 > data; 

選項2

2維的std ::向量

如果該Type1和Type2是整數,因爲你可能會發現模擬的圖形或笛卡爾空間時: 的std ::矢量<的std ::矢量<的Type3數據;

選項3

含Type1和Type2,它可以映射到的Type3

如果您也許希望與更多的值來裝飾你的兩種類型的用戶定義的類,你可以定義一個包含兩種類型的一類,並使用一個std ::地圖將其映射到第三式:

public: 
    MyClass(Type1 x, Type2 y) : x_(x), y_(y) 

    Type1 x() const { 
     return x_; 
    } 

    Type2 y() const { 
     return y_; 
    } 


private: 
    Type1 x_; 
    Type2 y_; 
}; 


std::map< MyClass, Type3 > data; 

選項1的好處是,它是真正快速和容易編碼,並且對於任何知道C++的人來說都應該是有意義的。選項2可能會稍微快一點,並且可以輕鬆修改以獲得更多維度。選項2的缺點是您的值需要是整數索引到二維向量中。

在我看來選項3是對我最好的選擇,因爲它是可讀的,地方上的Type1和Type2的類型沒有要求,並可以擴展到包含在一個非常合理的方式更多的數據。缺點選項3的是,你需要定義一個嚴格的MyClass的對象彼此比較,但這是相當簡單:

bool operator<(const MyClass & rhs) const { 
    return (rhs.x() <= x() && rhs.y() <= y()); 
} 

讓您的類的成員函數,你應該準備好了。

像編程的東西,在那裏,直到你考慮你在做什麼和多少時間,你願意投資的細節並不明顯正確的答案。不要忘記檢查關鍵存在和出界錯誤。 :)

+0

您的運營商<是錯誤的,我想。如果lhs.x rhs.y,那麼lhs MSalters 2009-07-13 10:33:19