gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:30:11 24 4
gpt4 key购买 nike

我有一个任务,我必须计算有多少不同种类的对象并保存结果以供以后根据它们创建图表。我正在做的是创建排序的 vector 来保存满足不同条件的元素,并对它们调用 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();

虽然这似乎太复杂了。毕竟我只想计算共同元素。有没有办法省略不必要的 vector 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));

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

最佳答案

几乎可以使用普通的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; }
};

关于c++ - STL中是否有默认的计数器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45192991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com