std :: list中每种特定类型的对象数

时间:2013-06-21 10:58:02

标签: c++ loops map

如何以一般自动方式计算集合中特定类型的对象数量(特别是列表),这不需要我提前识别特定类型的对象?< /强>

我有一个班级Card,它已多次进入heartsdiamondsspadesclubs。玩家有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中是否有已经实现的方法?

1 个答案:

答案 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.

希望有所帮助。