C++ 不使用默认构造函数的向量初始化

C++ 不使用默认构造函数的向量初始化,c++,C++,如何在没有默认构造函数的情况下减少以下代码的行数 #include <vector> enum Rank { DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }; enum Suit { HEART, DIAMOND, CLUB, SPADE }; struct Card { Card(Rank r, Suit s) : rank(r), suit(s) { }

如何在没有默认构造函数的情况下减少以下代码的行数

#include <vector>

enum Rank { DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE };

enum Suit { HEART, DIAMOND, CLUB, SPADE };

struct Card {
    Card(Rank r, Suit s) : rank(r), suit(s) { }
    Card(const Card& copy) : rank(copy.rank), suit(copy.suit) {}

    Rank rank;
    Suit suit;
};

const Card deckOfCards[52] = {
    Card(ACE, HEART),
    Card(DEUCE, HEART),
    Card(THREE, HEART),
    Card(FOUR, HEART),
    Card(FIVE, HEART),
    Card(SIX, HEART),
    Card(SEVEN, HEART),
    Card(EIGHT, HEART),
    Card(NINE, HEART),
    Card(TEN, HEART),
    Card(JACK, HEART),
    Card(QUEEN, HEART),
    Card(KING, HEART),
    Card(ACE, DIAMOND),
    Card(DEUCE, DIAMOND),
    Card(THREE, DIAMOND),
    Card(FOUR, DIAMOND),
    Card(FIVE, DIAMOND),
    Card(SIX, DIAMOND),
    Card(SEVEN, DIAMOND),
    Card(EIGHT, DIAMOND),
    Card(NINE, DIAMOND),
    Card(TEN, DIAMOND),
    Card(JACK, DIAMOND),
    Card(QUEEN, DIAMOND),
    Card(KING, DIAMOND),
    Card(ACE, CLUB),
    Card(DEUCE, CLUB),
    Card(THREE, CLUB),
    Card(FOUR, CLUB),
    Card(FIVE, CLUB),
    Card(SIX, CLUB),
    Card(SEVEN, CLUB),
    Card(EIGHT, CLUB),
    Card(NINE, CLUB),
    Card(TEN, CLUB),
    Card(JACK, CLUB),
    Card(QUEEN, CLUB),
    Card(KING, CLUB),
    Card(ACE, SPADE),
    Card(DEUCE, SPADE),
    Card(THREE, SPADE),
    Card(FOUR, SPADE),
    Card(FIVE, SPADE),
    Card(SIX, SPADE),
    Card(SEVEN, SPADE),
    Card(EIGHT, SPADE),
    Card(NINE, SPADE),
    Card(TEN, SPADE),
    Card(JACK, SPADE),
    Card(QUEEN, SPADE),
    Card(KING, SPADE)
};

class Deck {
public:
    Deck() : cards(deckOfCards, deckOfCards + 52) {}
    ~Deck() {}

private:
    std::vector<Card> cards;
};

您可以使用循环并将元素添加到构造函数主体中的容器中:

Deck() 
{
    for (int rank = (int)DEUCE; rank <= (int)ACE; ++rank) 
    {
        for (int suit = (int)HEART; suit <= (int)SPADE; ++suit)
        {
            cards.push_back(Card((Rank)rank, (Suit)suit));
        }
    }
}

如果每个枚举都有第一个枚举器和最后一个枚举器的哨兵,那么这可能会变得更干净,更不容易出错,但即使没有哨兵,这仍然比手工键入所有组合要好。

您可以使用循环并将元素添加到构造函数体中的容器中:

Deck() 
{
    for (int rank = (int)DEUCE; rank <= (int)ACE; ++rank) 
    {
        for (int suit = (int)HEART; suit <= (int)SPADE; ++suit)
        {
            cards.push_back(Card((Rank)rank, (Suit)suit));
        }
    }
}

如果每个枚举都有第一个枚举数和最后一个枚举数的哨兵,这可能会变得更干净,更不容易出错,但即使没有哨兵,这仍然比手工键入所有组合要好。

请注意,复制构造函数的功能与编译器隐式提供给您的完全相同。如果要编写复制构造函数,请确保在需要这三个函数中的一个时也要编写复制赋值运算符和析构函数,通常这三个函数都需要。减少行数?除了按照James的注释去掉多余的复制构造函数外,您还可以删除代码中的所有换行符,从而得到一行!或者,更准确地说,有两行,因为include需要单独的一行。我不认为你能做得比这少。@AndreyT:我看你是哈克,被哈克,是吗?注意你的复制构造函数做的事情和编译器隐式提供给你的完全一样。如果要编写复制构造函数,请确保在需要这三个函数中的一个时也要编写复制赋值运算符和析构函数,通常这三个函数都需要。减少行数?除了按照James的注释去掉多余的复制构造函数外,您还可以删除代码中的所有换行符,从而得到一行!或者,更准确地说,有两行,因为include需要单独的一行。我认为你不能做得比这少。@AndreyT:我看着你,被黑了,是吗?防止不必要的内存重新分配的好建议是使用卡。保留52;在这个周期之前。为了保持元素的顺序相同,你应该改变EnUm等级{Deice,三,四,五,六,七,八,九,十,杰克,皇后,King,ACE };到Enm等级{ACE,平分,三,四,五,六,七,八,九,十,杰克,皇后,国王};讨厌C演员。就我个人而言,我会定义Rank&operator++Rank&这在测试时也很有用。防止不必要的内存重新分配的好提示是使用卡。reserve52;在这个周期之前。为了保持元素的顺序相同,你应该改变EnUm等级{Deice,三,四,五,六,七,八,九,十,杰克,皇后,King,ACE };到Enm等级{ACE,平分,三,四,五,六,七,八,九,十,杰克,皇后,国王};讨厌C演员。就我个人而言,我会定义秩和运算符++秩&这在测试FOR时也很有用。