3

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

我有一个类,,Card它被多次归类为heartsdiamonds和。玩家有一个. 我想计算每个玩家手中每种牌的数量。spadesclubsstd::list<Card *> hand

我无法计算特定对象类型的实例,因为我正在初始化一个deck包含很多卡片的卡片,而我只想计算玩家手中的卡片。

我可以做一组 if 语句:

if ( strcmp( (*it)->cardType,"hearts")==0) {
...
} else if ( strcmp( (*it)->cardType,"diamonds")==0) {
...
} else if ...

但是如果我想添加一种新的卡片类型,这将变得乏味(我的目标是用大约 200 种卡片模拟游戏)。

将每个元素插入一个集合中会给我不同元素的数量,但我想知道每个不同元素的数量(“4 个红心,3 个俱乐部等”,而不是“4 个不同的花色”)。

在 C++ STL 中是否有已经实现的方法来执行此操作?

4

1 回答 1

4

用作std::map

std::map<std::string, int>  counts;

for(auto const & item : hand)
    ++counts[item->cardType]; //because item is Card*

这里重载的运算符[]forstd::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.

希望有帮助。

于 2013-06-21T11:07:01.883 回答