2011-05-16 80 views
1

如何在不使用默认构造函数的情况下减少以下代码的行数?不使用默认构造函数的矢量初始化

#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; 
}; 
+1

请注意,您的副本构造函数与编译器隐式提供的副本构造函数完全相同。如果你确实写了一个拷贝构造函数,那么一定要写出拷贝赋值操作符和析构函数(当你需要这三个函数中的一个时,你通常都需要这三个函数)。 – 2011-05-16 01:40:00

+0

减少行数?除了摆脱多余的复制构造函数(根据James的评论),您还可以删除代码中的所有换行符,从而以单行结束!或者更确切地说,有两行,因为'#include'需要一个单独的行。我认为你可以做到这一点。 – AnT 2011-05-16 01:51:29

+0

@AndreyT:我注视着你的黑客,被黑了,是吗? – 2011-05-16 02:11:09

回答

5

您可以使用一个循环和元素的构造函数体添加到容器:

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)); 
     } 
    } 
} 

这可以作出更清洁,更不容易出错,如果你有哨兵的FIRST_ENUMERATOR和每个枚举都可以使用LAST_ENUMERATOR,但即使没有这些,仍然比手动输入所有组合要好。

+2

好的提示可以防止不必要的内存重新分配,在这个循环之前会使用'cards.reserve(52);'。 为了让元素顺序相同,你应该改变'enum Rank {DEUCE,THREE,FOUR,FIX,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE};''enum Rank {ACE,DEUCE,THREE,FOUR,FIX,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING};' – mbykov 2011-05-16 01:50:44

+0

讨厌C剧组。就个人而言,我会定义'Rank&operator ++(Rank&)',这对测试海峡时也是有用的。 – 2011-05-16 08:28:20

相关问题