对结构int成员进行排序

Sort struct int members

本文关键字:排序 成员 结构 int      更新时间:2023-10-16

用C++对具有不同数量整数成员的struct进行排序的方法是什么。(注意它们总是ints(

假设我有一个结构,其中有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个ints,当然: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,我希望在不定义多个函数的情况下对每个结构体的成员进行排序。如果有更好的设计方法来解决这个问题(如评论中所述(,我很高兴知道。

正如@WhozCraig在评论中所提到的,关键不是像int a; int b; int c;那样在struct中声明单个整数值,而是使用std::array这样的容器(如果该类型结构中有固定数量的int(,或者使用std::vector(并根据需要向向量中添加任意多的int值(

<algorithm>标头提供的std::sort使int上的排序变得微不足道,因为可以使用默认的比较函数,而不必指定自己的任何特殊函数。通过使用容器提供的标准.begin().end()迭代器,以这种方式处理问题可以对std::arraystd::vector成员中包含的任意数量的整数进行排序,而不管包含多少整数。

使用std::array

例如,如果你想用固定的3整数数组对结构进行排序,你可以简单地做:

#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-integer100000-integers,唯一会更改的是您调用foo.ints.push_back(x);的次数(

使用std::greater<T>()进行降序排序

<functional>标头提供了几种标准比较,如std::greater<T>()std::less<T>()std::less_equal<T>()等。要对数组或向量进行排序,请使用std::greater<int>()作为比较函数,例如

/* sort foo.ints using std::greater<T>() compare */
std::sort (foo.ints.begin(), foo.ints.end(), std::greater<int>());

示例使用/输出

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

$ ./bin/sortfooints
1 2 3

(使用std::greater<int>()将导致3 2 1(

仔细看看,如果你还有问题,请告诉我。