set_difference算法可以輸出第一個範圍內的元素,而不是第二個元素。有沒有一種算法只會給我數量而不是差異。計算一組中不同元素的數量
我明白我可以實現自己的鏈接中描述的算法版本,或者我可以在得到結果後計算元素的數量。有沒有一個現有的API能夠有效地爲我做到這一點。
感謝
set_difference算法可以輸出第一個範圍內的元素,而不是第二個元素。有沒有一種算法只會給我數量而不是差異。計算一組中不同元素的數量
我明白我可以實現自己的鏈接中描述的算法版本,或者我可以在得到結果後計算元素的數量。有沒有一個現有的API能夠有效地爲我做到這一點。
感謝
這是一個操作,瑣碎,不需要特定的方法。如果你不能分配一個臨時的一套計算差異,然後讓它們的大小,只需用std::accumulate
或std::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()
就好。
你可以簡單地編寫你自己的類似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
}
您可以創建一個 「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;
};
您可以創建一個「CounterIterator」。 – Jarod42