2015-10-10 172 views
2

我有這樣一個複合數據類型:「不關心」領域

struct Key { 
    optional<int> a; 
    optional<int> b; 
    optional<int> c; 
}; 

我也有一個多集,multiset<Key>。例如,它包含

{1, 2, 3} 
{1, NULL, 3} 
{NULL, 2, 3} 
{NULL, NULL, 3} 

我想獲取此多重對象中與{1, 2, 3}匹配的所有對象。但有一個問題:NULL字段應該與任何內容匹配。例如,{1, 2, 3}{1, NULL, 3}匹配。

我試圖定義一個忽略NULL值的比較器(<)。例如{1, NULL, NULL} == {NULL, 2, 3}。但它不遵循弱嚴格的排序,它給了我錯誤的結果。

我該怎麼做?

+0

你不能。在最糟糕的情況下,您必須獲取所有元素。也可能將密鑰存儲在向量中並嘗試匹配每個密鑰。 –

回答

2

您的問題在這裏更是嚴重不符合弱嚴格排序規則。您的等於甚至不會是等價關係:{1,NULL,3}與{1,2,3}和{1,4,3}匹配,但{1,2,3}不匹配{1, 4,3}。我的結論是,你不能依賴任何標準容器來滿足你的匹配要求,捕獲所有的值。

如果你只是想存儲它們,你應該嘗試使用unordered_setunordered_multiset,因爲它可以讓你存儲的值沒有任何問題。但是你將不得不手動實現一個搜索容器匹配的方法。

當心:我不建議你繼承一個標準集裝箱(它通常是一個錯誤的想法,因爲他們沒有被設計成允許推導,有沒有虛析構函數...),而是包括一個在自定義類和委託存儲。