c++ - 如何在 C++ 中进行特殊排序?

标签 c++

有人如何对以下情况进行特殊排序: 有一副纸牌。你有一个二维数组,它是由两个一维数组的组合创建的:一个代表花色,另一个代表等级:

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/

相关文章:

c++ - 如何在 C++ builder 中渲染 openGL 帧?

c++ - #define 作为缺失概念的解决方法

c++ - 优化求和循环

c++ - vector::shrink_to_fit 是否允许重新分配?

c++ - Concat 用于预定义的宏

c++ - 函数中auto_ptr的返回值

C++ RVO : when it happens?

java - 三星 S9+ 和 RenderScript 内在函数

c++ - 你如何在 C++ 中为二维数组分配内存

java - 有人可以确认我的双调序列算法中的最小元素是否正确吗?