如何以不需要我提前识别特定类型对象的一般自动方式计算集合(特别是列表)中特定类型对象的数量?强>
我有课,Card
, 它被多次 segmentation 为 hearts
, diamonds
, spades
和 clubs
.玩家有一个 std::list<Card *> hand
.我想统计每个玩家手中每种牌的数量。
我不能count instances of specific object types ,因为我正在初始化一个 deck
包含很多卡片,我只想数玩家手中的卡片。
我可以做一组 if 语句:
if ( strcmp( (*it)->cardType,"hearts")==0) {
...
} else if ( strcmp( (*it)->cardType,"diamonds")==0) {
...
} else if ...
但是如果我想添加一种新的纸牌类型(我的目标是用大约 200 种纸牌模拟游戏),这会变得乏味。
将每个元素插入到集合中会得到 number of distinct elements ,但我想知道每个不同元素的数量(“4 颗心,3 颗梅花等”,而不是“4 种不同的花色”)。
在 C++ STL 中是否有已经实现的方法来执行此操作?
最佳答案
将 std::map
用作:
std::map<std::string, int> counts;
for(auto const & item : hand)
++counts[item->cardType]; //because item is Card*
此处 std::map
的重载运算符 []
返回对关联键值的引用(如果该键存在)。使用返回的引用递增该值。如果该键不存在,则使用该键创建一个新条目,默认初始化值在这种情况下为零,然后返回引用。
完成计数后,您可以将它们打印为:
for(auto const & c : counts)
std::cout << c.first << " appears " << c.second << " times.\n";
它将打印如下内容:
hearts appears 3 times.
diamonds appears 7 times.
spades appears 4 times.
希望对您有所帮助。
关于c++ - std::list 中每种特定类型的对象数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17233554/