计算一个集合中不同于另一个集合的元素数
Count the number of elements different in one set than the other
set_difference算法为您提供第一个范围内而不是第二个范围内的元素的输出。有没有一种算法只会给我计数,而不是差值。
我知道我可以实现我自己版本的链接中描述的算法,或者我可以在得到结果后计算元素的数量。是否有一个现有的API可以有效地为我做这件事。
感谢
您只需编写自己的类似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
}
这是一个非常琐碎的操作,不需要特定的方法。如果你负担不起分配一个临时集来计算差异,然后得到它们的大小,只需使用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()
就可以了。
您可以创建一个"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;
};
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 模板模板集合接受另一个模板参数
- 维护多集中数字的排序列表和另一个集合中的累积总和
- std::set的替代品(可以将元素从一个集合移动到另一个集合)
- 只有Arduino的第一个对象在包含在另一个对象的集合/数组中时会丢失其数据属性值
- 计算一个集合中不同于另一个集合的元素数
- 访问双元素集合中的另一个元素的简洁语法是什么?
- 将unique_ptr从一个集合移动到另一个集合
- 如何使用另一个类的静态集合初始化集合