如何以一般自动方式计算集合中特定类型的对象数量(特别是列表),这不需要我提前识别特定类型的对象?< /强>
我有一个班级Card
,它已多次进入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中是否有已经实现的方法?
答案 0 :(得分:4)
将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.
希望有所帮助。