14
目前,我認爲我最好的選擇是使用std :: set_intersection,然後檢查較小輸入的大小是否與set_intersection填充的元素的數量相同。如何檢查一個向量是否是另一個向量的子集?
有沒有更好的解決方案?
目前,我認爲我最好的選擇是使用std :: set_intersection,然後檢查較小輸入的大小是否與set_intersection填充的元素的數量相同。如何檢查一個向量是否是另一個向量的子集?
有沒有更好的解決方案?
試試這個:
if (std::includes(set_one.begin(), set_one.end(),
set_two.begin(), set_two.end()))
{
// ...
}
關於includes()。
的包括()算法比較兩個 排序序列,並且如果 在範圍[START2,每一個元素 finish2)被包含在所述範圍 [啓動1返回true,finish1)。否則返回錯誤 。包含()假定 序列使用 運算符<()或使用謂詞 comp進行排序。
運行在
在大多數((finish1 - 啓動1)+(finish2 - START2))* 2 - 進行1次比較。
Plus O(nlog(n))用於排序向量。你不會比這更快。
我相信std :: set_intersection將執行與上面相同的操作(即(2 *(count1 + count2)) - 1操作) – Nim 2010-11-01 11:25:39
最壞的情況是相同的,但如果結果爲false,include將執行它的工作快多了。而且你還在交集中使用了一個更多的矢量。正如名稱所示,set_intersection應該用於查找該交集幷包含用於檢查一個集合是否是另一個集合的子集。 – Klark 2010-11-01 11:55:47
如果你的數據在'std :: set'中,你可以使用'std :: set_difference' – 2015-01-16 11:14:29