2015-11-05 75 views
1

set_difference算法可以輸出第一個範圍內的元素,而不是第二個元素。有沒有一種算法只會給我數量而不是差異。計算一組中不同元素的數量

我明白我可以實現自己的鏈接中描述的算法版本,或者我可以在得到結果後計算元素的數量。有沒有一個現有的API能夠有效地爲我做到這一點。

感謝

+0

您可以創建一個「CounterIterator」。 – Jarod42

回答

0

這是一個操作,瑣碎,不需要特定的方法。如果你不能分配一個臨時的一套計算差異,然後讓它們的大小,只需用std::accumulatestd::for_each計算它:

unordered_set<int> set1 = {1,2,3,4,5}; 
unordered_set<int> set2 = {2,4,6};  
size_t count = set1.size() - std::accumulate(set1.begin(), set1.end(), 0, [&set2](size_t previous, int value) { return set2.count(value) + previous; }); 

但是,如果你沒有任何具體的要求或巨大的套做set_difference + size()就好。

1

你可以簡單地編寫你自己的類似OutputIterator的東西,你可以傳入std::set_difference。 OutputIterator需要是可取的,可分配的和可增量的。還要注意std::set_difference返回一個OutputIterator,所以我們可以利用它將其轉換爲int

因此類似:

struct CountingIterator 
    : std::iterator<std::output_iterator_tag, int> 
{ 
    template <typename T> 
    CountingIterator& operator=(T&&) { 
     ++count; 
     return *this; 
    } 

    CountingIterator& operator*() { return *this; } 
    CountingIterator& operator++() { return *this; } 

    operator int() { return count; } 

    int count = 0; 
}; 

其中,修改std::set_difference收益的例子時:

int main() { 
    std::vector<int> v1 {1, 2, 5, 5, 5, 9}; 
    std::vector<int> v2 {2, 5, 7}; 

    int count = 
     std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), 
         CountingIterator()); 

    std::cout << count << std::endl; // prints 4 
} 
0

您可以創建一個 「CountingIterator」 爲OutputIterator,是這樣的:

struct CountingIterator 
{ 
    CountingIterator& operator*() { return *this; } 

    CountingIterator& operator ++() { return *this; } 
    CountingIterator& operator ++(int) { return *this; } 

    template <typename T> 
    CountingIterator& operator =(const T&) { ++counter; return *this; } 

    int counter = 0; 
};