对结构int成员进行排序
Sort struct int members
用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
s,当然: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::array
或std::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-integer
或100000-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
(
仔细看看,如果你还有问题,请告诉我。
- 类成员重新排序
- 如何在 c++11 中静态断言 std::array 类成员进行排序?
- 按类成员的顺序对包含类对象的C++向量进行排序
- 只对向量中的一个类成员进行排序,其他成员保持不变
- 合并 2 个排序的链表。必需的成员函数 bool Merge(List342 &list1):
- 对结构int成员进行排序
- C++排序向量<double>与在<Object>双成员变量上键控的向量
- 如何对类成员向量进行排序
- 如何对同一数组索引下的结构成员进行排序?
- 对多个数据成员进行排序
- 根据类成员对同一密钥的多映射元素进行排序
- 在对结构数组的一个成员进行排序后,移动其成员的其余部分
- std::具有自定义比较函数结果的排序函数错误:必须调用对非静态成员函数的引用
- 排序链表-移动节点还是交换数据成员
- 如何为涉及对象成员、间接寻址和强制转换的排序算法实现lambda函数
- 使用 #include 按<algorithm>字符串数据成员对类对象的向量进行排序
- 通过私人成员对自定义对象进行排序
- 如何根据其中一个成员的值对结构数组进行排序,从而在另一个成员的基础上断开联系
- 重新排序成员声明
- 使用sort()排序成员向量的比较函数