对struct int成员进行排序

时间:2019-10-28 22:39:43

标签: c++

使用C ++方式对具有不同数量的整数成员的struct进行排序的方式是什么。 (请注意,它们总是int s)

假设我有一个包含3个int的结构,并且我想对它们进行排序:

void Sort(int& x, int& y, int& z)
{
    //do stuff
    if(x > y >...etc) x = y z=tmp //etc etc
}

struct Foo
{
    int a {1};
    int b {3};
    int c {2};
};


int main()
{
    Foo foo;
    Sort(foo.a, foo.b, foo.c);
}

我也可以传递Foo作为参数,而不是3个int,当然是void Sort(Foo& foo)

但是假设我还有另一个具有不同数量整数的结构:

struct Bar
{
    int a{7};
    int b{8};
};

我将不得不创建另一个排序功能:

void Sort(int& y, int& x) {}...

甚至仅针对结构Bar本身:

void Sort(Bar& bar) {};

现在,我有很多结构,它们都包含不同数量的int作为数据成员。整体结构以降序排序的整体方法是什么?

-编辑

我将编辑问题,因为也许我的基本方法是错误的。 在我最初的问题中,我有两个结构:

struct PlayerPrince {
    int highCard;
    int middleCard;
};
struct PlayerPrincess {
    int highCard;
    int middleCard;
    int lowCard;
};

数据成员的值将根据用户输入顺序进行分配。只能保证int highCard仅是对结构排序后的最高卡片。

结构PlayerPrince不需要具有lowCard,我想对每个结构的成员进行排序而不定义多个函数。如果有解决该问题的更好的设计方法(如评论中所述),我将很高兴知道。

1 个答案:

答案 0 :(得分:1)

正如@WhozCraig在评论中提到的那样,关键不是像%d那样在struct中声明各个整数值,而是使用诸如std::array这样的容器(如果您在该类型struct中具有固定数量的int a; int b; int c;),或使用std::vector(并向向量添加任意数量的int值)

然后,int标头提供的

std::sort使得在<algorithm>上的排序变得微不足道,因为可以使用default-compare函数,而不必指定自己的任何特殊函数。通过这种方式解决问题,使您可以对intstd::array成员所包含的任意数量的整数进行排序,而不管使用标准std::vector和{{1}包含多少个整数}容器提供的迭代器。

使用.begin()

例如,如果要使用固定的3整数数组对结构进行排序,则只需执行以下操作:

.end()

使用std::array

要在结构中使用任意数量的整数,只需将#include <iostream> #include <array> #include <algorithm> struct Foo { /* struct Foo with std::array<int, 3> instead of 3 int variables */ std::array<int, 3> ints; }; int main (void) { Foo foo; /* instance of foo */ foo.ints.at(0) = 1; /* add 3-int to array ints */ foo.ints.at(1) = 3; foo.ints.at(2) = 2; /* sort foo.ints using default compare */ std::sort (foo.ints.begin(), foo.ints.end()); for (auto& i : foo.ints) /* output sorted foo.ints */ std::cout << " " << i; std::cout << '\n'; } 替换为std::vector,然后使用std::array向您的向量添加任意多个整数。上面的情况变为:

std::vector

注意:,您可以使用.push_back()添加#include <iostream> #include <vector> #include <algorithm> struct Foo { /* struct Foo with std::vector<int> instead of separate integers */ std::vector<int> ints; }; int main (void) { Foo foo; /* instance of foo */ foo.ints.push_back(1); /* add 3-int to vector ints */ foo.ints.push_back(3); foo.ints.push_back(2); /* sort foo.ints using default compare */ std::sort (foo.ints.begin(), foo.ints.end()); for (auto& i : foo.ints) /* output sorted foo.ints */ std::cout << " " << i; std::cout << '\n'; } std::vector,唯一改变的是您呼叫{{1} })

使用1-integer进行降序排序

100000-integers标头提供了几种标准比较,例如foo.ints.push_back(x);std::greater<T>()<functional>等。要对数组或向量进行降序排序,可以使用{ {1}}作为比较功能,例如

std::greater<T>()

使用/输出示例

在两种情况下都使用默认排序,输出是相同的:

std::less<T>()

(使用std::less_equal<T>()将导致std::greater<int>()

仔细检查一下,如果还有其他问题,请告诉我。