根据另一个数组对数组进行排序。如何?

时间:2014-03-17 19:01:05

标签: c++ arrays sorting

我有一个我需要排序的数组。它是使用C ++使用其他2个数组制作的。

string deck[4][13];
string type[4] = {"Hearts","Diamonds","Spades","Clubs"};
string cards[13] = {"Ace","King","Queen","Jack","10","9","8","7","6","5","4","3","2"};

for (int i = 0; i<4; i++)
{
    for (int j=0; j<13 ; j++)
    {
        deck[i][j]=type[i]+"-"+cards[j];

        cout << deck[i][j] << " ";
    }

    cout << endl;
}

我正在洗牌,然后再试一次。 我理解将套牌的索引与索引进行比较,其他阵列是最简单的方法,但我不明白如何做到这一点。 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

建议:创建卡片类并使用std::vector 这将减少程序的复杂性(和缺陷)。

阵列很难使用,因此请使用std::vector。 由于卡包含套装和号码,我们就这样继续:

class Card
{
  std::string    suit_text;
  std::string    card_value;
};

鉴于上述定义,可以将牌组和牌手作为Card容器

std::vector<Card>  deck(52); // Allocate space for 52 cards in the deck.
std::vector<Card>  poker(5); // A poker hand consists of 5 cards.

关于如何使用该卡的剩余代码留给OP。

编辑1:基础52数学
为卡分配随机套装和值可以被认为是选择0到51(或1和52)之间的随机数。诀窍是将数字转换为套装数量和数值。

一套西装中有13张牌,所以卡号 / 13会产生西装号码:

  suit_id = random_number / 13;
  card_value = random_number % 13;

此外,使用std::bitset可能有助于确定已生成哪些随机数。

答案 1 :(得分:1)

您的情况需要采用与使用字符串捕获套装和卡片不同的方法。

您对西装的排序顺序,“红心”&gt; “钻石”&gt; “黑桃”&gt; “俱乐部”使用数字很容易实现,但需要不必要的复杂功能 使用字符串时。

同样适用于卡片。

我的建议是创建代表套装和卡片的枚举。存储这些枚举 对于所有计算。当打印消息时,有一个函数返回给定卡片的字符串。

enum Suit { HEARTS, DIAMONDS, SPADES, CLUBS};
enum Card { ACE, KING, QUEEN, JACK, TEN, NINE, EIGHT, SEVEN, SIX, FIVE, FOUR, THREE, TWO};

struct DeckCard
{
   Suit suit;
   Card card;

   // Implement the < operator to make it easy to sort a deck of cards.
   bool operator<(DeckCard const& rhs) const
   {
      if ( this->suit != rhs.suit )
      {
         return (this->suit < rhs.suit);
      }
      return (this->card < rhs.card);
   }

   std::string toString()
   {
      return suiteToString() + "-" + cardToString();
   }
   std::string suiteToString()
   {
      switch ( suit )
      {
         case HEARTS:
            return "Hearts";

         case DIAMONDS:
            return "Diamonds";

         case SPADES:
            return "Spades";

         case CLUBS:
            return "Clubs";

         default:
      }
      return "Unknown Suit";
   }

   std::string cardToString()
   {
      switch ( card )
      {
         case ACE:
            return "Ace";

         case KING:
            return "King";

         case QUEEN:
            return "Queen";

         case JACK:
            return "Jack";

         case TEN:
            return "10";

         case NINE:
            return "9";

         case EIGHT:
            return "8";

         case SEVEN:
            return "7";

         case SIX:
            return "6";

         case FIVE:
            return "5";

         case FOUR:
            return "4";

         case THREE:
            return "3";

         case TWO:
            return "2";

      }

      return "Unknwon Card";
   }
};

DeckCard deck[4*13];

for (int i = 0; i<4; i++)
{
    for (int j=0; j<13 ; j++)
    {
        deck[i*13+j].suit = type[i];
        deck[i*13+j].card = cards[j];

        cout << deck[i*13+j].toString() << " ";
    }

    cout << endl;
}

// Sort the cards.
std::sort(deck[0], deck[51]);

您也可以使用std::shuffle

来洗牌