【发布时间】:2019-12-21 18:26:48
【问题描述】:
关于成员变量的结构向量排序有很多答案。使用std::sort 和谓词函数比较结构成员,这很容易。真的很简单。
但我有一个不同的问题。假设我有以下结构:
struct Test {
int a{};
int b{};
int toSort{};
};
以及该结构的向量,例如:
std::vector<Test> tv{ {1,1,9},{2,2,8},{3,3,7},{4,4,6},{5,5,5} };
我不想对向量元素进行排序,而只想对成员变量中的值进行排序。所以预期的输出应该等于:
std::vector<Test> tvSorted{ {1,1,5},{2,2,6},{3,3,7},{4,4,8},{5,5,9} };
我想让解决方案成为某种通用解决方案。然后我想出了一个(对不起)预处理器宏解决方案。请看以下示例代码:
#include <iostream>
#include <vector>
#include <algorithm>
struct Test {
int a{};
int b{};
int toSort{};
};
#define SortSpecial(vec,Struct,Member) \
do { \
std::vector<decltype(Struct::Member)> vt{}; \
std::transform(vec.begin(), vec.end(), std::back_inserter(vt), [](const Struct& s) {return s.Member; }); \
std::sort(vt.begin(), vt.end()); \
std::for_each(vec.begin(), vec.end(), [&vt, i = 0U](Struct & s) mutable {s.Member = vt[i++]; }); \
} while (false)
int main()
{
// Define a vector of struct Test
std::vector<Test> tv{ {1,1,9},{2,2,8},{3,3,7},{4,4,6},{5,5,5} };
for (const Test& t : tv) std::cout << t.a << " " << t.b << " " << t.toSort << "\n";
// Call sort macro
SortSpecial(tv, Test, toSort);
std::cout << "\n\nSorted\n";
for (const Test& t : tv) std::cout << t.a << " " << t.b << " " << t.toSort << "\n";
}
由于不应该在 C++ 中使用宏,所以我的问题是:
1.有没有算法库的解决方案?
2。或者这可以通过模板来实现吗?
【问题讨论】: