我有一个包含19个变量的结构,我需要使用不同的排序算法来对这个结构进行排序,事实是它可以通过任何这些变量进行排序.我想知道是否有任何方法可以在结构中动态访问这些数据,这样我就可以编写一个方法来进行排序,而不是编写19个不同的方法来运行相同的排序算法但是在内部的不同变量上.
所以我有我的结构
struct team_stats{
float yards_per_game;
int total_points;
etc etc
team_stats* arr = new team_stats[32];
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情(显然它不会是一个字符串因为这没有意义,但只是这背后的想法):
quickSort(arr, "yards_per_game"); // sorts by yards per game
quickSort(arr, "total_points"); // sorts by total points
quickSort(team_stats* arr, string field) {
while (i <= j) {
while (arr[i].field < pivot)
etc. etc.
Run Code Online (Sandbox Code Playgroud)
而不是像这样做:
if (field == "yards_per_game")
quickSortYards(arr);
else if (field == "total_points")
quickSortPoints(arr);
quickSortYards(team_stats* arr) {
while (i <= j) {
while (arr[i].yards_per_game < pivot)
etc. etc.
quickSortPoints(team_stats* arr) {
while (i <= j) {
while (arr[i].total_points < pivot)
etc. etc.
Run Code Online (Sandbox Code Playgroud)
因为后者要求我必须编写38个不同的函数,仅用于使用一种算法进行排序,我觉得这只是一团糟
谢谢
如果所有数据字段都具有相同的类型,则可以使用纯指针到成员并且不使用模板来实现.
但是,看起来您对不同的字段有不同的类型.在这种情况下,模板是最简单的方法.例如,您可以使用这样的东西
template <typename T, typename M> void sort_by_field(T a[], size_t n, const M T::*p)
{
std::sort(a, a + n, [p](const T &l, const T &r) { return l.*p < r.*p; });
}
struct S
{
int a;
float b;
};
int main()
{
S s[100] = { ... };
sort_by_field(s, 100, &S::a);
sort_by_field(s, 100, &S::b);
}
Run Code Online (Sandbox Code Playgroud)
很容易更新上面的sort_by_field函数来接受自定义比较器,而不是<lambda内部的硬编码比较.
在上面的版本中,sort_by_field我指向了成员p的正常运行时函数参数.也可以使它成为编译时模板参数.这只是在代码的运行时参数化(更慢,但代码膨胀更少)和编译时参数化(更快,但更多代码膨胀)之间找到适当平衡的问题.
也可以完全不使用模板,使用纯运行时参数化,通过使用字节偏移替换指向成员的指针并使用qsort-style比较器回调来实现它.但这将成为一个更具参与性和最强硬的C风格解决方案.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |