我有一个指向对象的指针数组,这些对象是来自外部代码的类的实例,我宁愿不改变。
我还有一个通过调用每个对象上的函数生成的int的向量。所以我有
A: [pointerToObj1, pointerToObj2, ... pointerToObjN]
和
B: [obj1Int, obj2Int, ..... objNInt]
如何轻松地对A进行排序,使其按B的值排序。我有可用的提升。
如果B是
[3, 1, 2]
我想按顺序对A进行排序
[pointerToObj2, pointerToObj3, pointerToObj1]
在javascript中你可以这样做
B.sort(function(a,b){return A[B.indexOf(a)] < A[B.indexOf(b)];});
答案 0 :(得分:3)
制作一个包含A&amp; A的对矢量乙
vector<pair<pointerToObjType, int>> order(N);
for (int i=0; i<N; ++i){
order[i] = make_pair(A[i], B[i]);
}
创建自定义比较器以对配对向量进行排序。
struct ordering {
bool operator ()(pair<pointerToObjType, int> const& a,
pair<pointerToObjType, int> const& b) {
return a.second < b.second;
}
};
对配对矢量进行排序。
sort(order.begin(), order.end(), ordering());
可以使用order[i].first
。
答案 1 :(得分:3)
一种选择是将您的“得分”数组存储在std::map<MyObject, int> scores
中。现在你可以创建一个比较器
bool compare(const MyObject* lhs, const MyObject* rhs) {
return scores[*lhs] < scores[*rhs];
}
现在你只需做
std::sort(vectorOfObjects.begin(), vectorOfObjects.end(), compare);
不幸的是,这要求scores
是全局变量,或scores
和compare
打包在同一个类中。
也许更好的方法是使用lambda:
std::sort(vectorOfObjects.begin(), vectorOfObjects.end(),
[&scores] (const MyObject* lhs, const MyObject* rhs) {scores[*lhs] < scores[*rhs];});
这允许您将scores
声明为局部变量并将其捕获到lambda中。
此解决方案的一个缺点是,为了将MyObject
类用作std::map
的键,您必须为类(或要传递给的比较器)实现operator<()
std::map
构造函数)。幸运的是,您可以将其编写为全局函数,而不必更改类本身。但是,这需要以某种方式直接比较对象。