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

Number of objects of each specific type in std::list

本文关键字:类型 对象 列表 std      更新时间:2023-10-16

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

我有一个类Card,它被分为heartsdiamondsspadesclubs好几次。玩家有一个std::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中是否有已经实现的方法可以做到这一点?

使用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.

希望能有所帮助。