我有一个任务,我必须计算有多少种不同类型的对象,并保存结果以便以后创建图形。我正在做的是创建包含满足不同条件的元素的有序向量,并在它们上调用std::set_intersection
以查找它们中有多少满足复合语句。例如:
// 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));
如果没有这样的东西,有没有简单的方法来创建这样的元对象?
答案 0 :(得分:2)
你几乎使用普通int
。
std::set_intersection
在输出迭代器,一元operator*
和operator++
上调用两个运算符。在int
上调用后者是你如何计算的,但你需要一个包装器来忽略operator*
。
你如何忽略operator*
?它必须返回允许*iter = value
的内容。好吧,你的包装器可以返回*this
。这只意味着你的包装器也会调用operator=
。这又可以返回*this
。
所以,把它们放在一起:
class counter {
size_t count = 0; // Let's count a bit further
public:
counter& operator++() { ++count; return *this; } // ++X
counter& operator++(int) { ++count; return *this; } // X++
counter& operator*() { return *this; }
template<typename T> counter& operator=(T&&) { return *this; }
counter& operator=(counter&) = default; // Don't break normal assignment.
operator size_t() const { return count; }
};