有人如何对以下情况进行特殊排序: 有一副纸牌。你有一个二维数组,它是由两个一维数组的组合创建的:一个代表花色,另一个代表等级:
string suit[4] = { "H", "D", "S", "C" };
string rank[13] = { "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3", "2" };
它们组合起来创建一个二维数组([4][13])
,使用这个组合,
suit[i1] + "-" + rank[i2]
洗牌后,排列不再按顺序排列,应恢复到原来的顺序,红桃先到,方 block 再到,依此类推。同样,每组应该先有王牌,然后是国王,依此类推。
如何针对这种情况进行特殊排序?
我的想法:
我们首先要读取数组。第一个元素应该与下一个元素进行比较。棘手的部分就是这个比较。我们应该在比较中使用什么类型的理由。假设我们有 D-A,然后是 H-2。因此,我们首先读取字符串的第一个字符 D 并将其与下一个字符进行比较。如果它们相同,我们应该跳转到字符串“D-A”的第三个条目。如果没有,我们进行比较。有更容易的方法吗?如何定义比较,说 H>D 和 A>K?以及如何使用二维数组实现此方法,因为简单排序仅适用于一维数组,不适用于二维数组。
最佳答案
基于 GWW 的评论:
enum suit { club, spade, diamond, heart };
enum rank {
two, three, four, five, six, seven, eight,
nine, ten, jack, queen, king, ace
};
using card = std::pair<suit, rank>;
int main ()
{
std::vector<card> deck{
{diamond, five}, {spade, ace},
{club, two}, {spade, nine}
};
std::sort(deck.begin(), deck.end());
for (auto c : deck)
cout << c.first << " " << c.second << endl;
}
即内部表示与外观分离,用enum
对于前者;定制operator<<
可以照顾后者。 card
基于 std::pair
使用其 operator<
按字典顺序进行比较,如果我理解正确,这就是你想要的。
这假设您将一副牌存储在一维 vector
中.我认为在大多数情况下这比二维更方便。事实上,我不明白你为什么要排序时坚持使用 2D。
关于c++ - 如何在 C++ 中进行特殊排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22580123/