我有一个任务,我必须计算有多少种不同类型的对象,并保存结果以便稍后从中创建图形。我正在做的是创建存储满足不同条件的元素的排序向量,并在其上调用std::set_intersection
来查找它们中有多少满足复合语句。例如:STL中是否有默认的计数器对象
// Count round and black objects
std::vector<SomeObject*> roundAndBlackObjects;
std::set_intersection(roundObjects.begin(), roundObjects.end(),
blackObjects.begin(), blackObjects.end(),
std::back_inserter(roundAndBlackObjects));
std::size_t numRoundAndBlackObjects = roundAndBlackObjects.size();
虽然这似乎太复杂了。毕竟,我只想计算共同的元素。有没有办法省略不必要的矢量push_backs?是否有捷径可寻?就像输出迭代器生成器一样,它创建一个不构造任何东西的虚拟输出迭代器,只是对其增量的调用进行计数。这样,我可以做这样的事情:
// Count round and black objects
std::size_t numRoundAndBlackObjects = 0;
std::set_intersection(roundObjects.begin(), roundObjects.end(),
blackObjects.begin(), blackObjects.end(),
std::iterator_callback_counter<SomeObject*>(numRoundAndBlackObjects));
如果没有这样的事情,有一个简单的方法来创建这样的元对象?
你能否解释一下什么是太复杂?在我看来,你想要做的是一组交集的教科书示例。我也不明白你问题的标题是什么意思。 –
Boost有[counting_iterator](http://www.boost.org/doc/libs/1_50_0/libs/iterator/doc/counting_iterator.html)。 – Jarod42
如果你想建立一个直方图,一个'std :: map'确实很好地工作,只需要线性遍历数据集来填充它。 – NathanOliver