给定2套(C ++)有一种方便的方法来获得没有任何分配的交集的大小(如std :: set_intersection那样)
当然,我可以复制实现减去作业,但我总是不会重新发明轮子
int count = 0;
while (first1!=last1 && first2!=last2)
{
if (*first1<*first2) ++first1;
else if (*first2<*first1) ++first2;
else {
count++; ++first1; ++first2;
}
}
我正在考虑使用std :: set_intersection并传递&#34;计数&#34;迭代符...?
答案 0 :(得分:4)
在Boost Iterator库和C ++ 14的通用lambdas的帮助下:
#include <set>
#include <algorithm>
#include <iostream>
#include <boost/function_output_iterator.hpp>
int main()
{
std::set<int> s1 { 1,2,3,4 };
std::set<int> s2 { 3,4,5,6 };
int i = 0;
auto counter = [&i](auto){ ++i; }; // C++14
// auto counter = [&i](int ){ ++1; }; // C++11
// pre C++11, you'd need a class with overloaded operator()
std::set_intersection(
s1.begin(), s1.end(), s2.begin(), s2.end(),
boost::make_function_output_iterator(counter)
);
std::cout << i;
}
输出为2
。
答案 1 :(得分:0)
另一个解决方案可能是查看std::set_intersection
代码并实现您的计数器类以反映它的行为。这取决于operator ++的使用,std::set_intersection
使用前缀,但我还添加了postfix运算符。
#include <set>
#include <algorithm>
#include <iostream>
class CountIt {
public:
CountIt() : storage(0), counter(0) {}
CountIt& operator++()
{
++counter;
return *this;
}
CountIt operator++(int)
{
CountIt oldValue = *this;
return ++( *this);
}
int& operator*() { return storage;}
int storage, counter;
};
int main()
{
std::set<int> s1 { 1,2,3,4 };
std::set<int> s2 { 3,4,5,6 };
CountIt const & c = std::set_intersection(
s1.begin(), s1.end(), s2.begin(), s2.end(),
CountIt()
);
std::cout << c.counter; // 2, hopefuly
}