使用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
,我想对每个结构的成员进行排序而不定义多个函数。如果有解决该问题的更好的设计方法(如评论中所述),我将很高兴知道。
答案 0 :(得分:1)
正如@WhozCraig在评论中提到的那样,关键不是像%d
那样在struct
中声明各个整数值,而是使用诸如std::array
这样的容器(如果您在该类型struct中具有固定数量的int a; int b; int c;
),或使用std::vector
(并向向量添加任意数量的int
值)
int
标头提供的 std::sort
使得在<algorithm>
上的排序变得微不足道,因为可以使用default-compare函数,而不必指定自己的任何特殊函数。通过这种方式解决问题,使您可以对int
或std::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>()
)
仔细检查一下,如果还有其他问题,请告诉我。