STL中是否有默认的计数器对象

时间:2017-07-19 14:04:17

标签: c++ count iterator metaprogramming

我有一个任务,我必须计算有多少种不同类型的对象,并保存结果以便以后创建图形。我正在做的是创建包含满足不同条件的元素的有序向量,并在它们上调用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));

如果没有这样的东西,有没有简单的方法来创建这样的元对象?

1 个答案:

答案 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; }
};
相关问题