gpt4 book ai didi

c++ - 如何使用枚举类值作为 for 循环的一部分?

转载 作者:可可西里 更新时间:2023-11-01 18:18:25 30 4
gpt4 key购买 nike

我正在尝试通过遍历枚举 SuitRank 来创建一副纸牌(我知道没有很好的方法来遍历枚举,但我不知道看不到替代品)。为此,我在每个枚举的末尾添加了一个枚举器 enum_count,其值表示枚举的长度和末尾。

#include <vector>

using namespace std;

enum class Suit: int {clubs, diamonds, hearts, spades, enum_count};
enum class Rank: int {one, two, three, four, five, six, seven, eight,
nine, ten, jack, queen, king, ace, enum_count};

struct Card {
Suit suit;
Rank rank;
};

class Deck{
vector<Card> cards{};
public:
Deck();
};

Deck::Deck() {
// ERROR ON THE BELOW LINE
for (Suit suit = Suit::clubs; suit < Suit::enum_count; suit++) {
for (Rank rank = Rank::one; rank < Rank::enum_count; rank++) {
Card created_card;
created_card.suit = suit;
created_card.rank = rank;
cards.push_back(created_card);
};
};
};

但是,当我尝试遍历枚举时,编译器不喜欢我试图在 for 循环中递增 suit++rank++ ,说明:

card.cpp|24|error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]|
card.cpp|25|error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]|

在不丢弃有用的枚举数据结构的情况下创建一副纸牌的最佳方法是什么?

最佳答案

我建议做一些不同的事情。创建一个 Suit vector 和一个到 Rank 的 vector ,并使用 STL 的强大功能对它们进行循环

const std::vector<Suit> v_suit {Suit::clubs, Suit::diamonds, Suit::hearts, Suit::spades};

const std::vector<Rank> v_rank {Rank::one, Rank::two, Rank::three, Rank::four, Rank::five,
Rank::six, Rank::seven, Rank::eight, Rank::nine, Rank::ten, Rank::jack,
Rank::queen, Rank::king, Rank::ace};

是的,你必须输入它们两次,但这允许你使用你想要的任何值(即不连续),而不是使用像 enum_count 这样尴尬的东西(你想要什么卡?给我一个钻石 enum_count!!),无需转换,并使用提供给 std::vector 的迭代器。

使用它们:

for(const auto & s : v_suit)
for (const auto & r : v_rank)
cards.push_back({s,r});

关于c++ - 如何使用枚举类值作为 for 循环的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35313043/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com