根据另一个数组的值对一个数组进行排序?

时间:2014-10-26 04:28:02

标签: c++ arrays sorting

我有一个指向对象的指针数组,这些对象是来自外部代码的类的实例,我宁愿不改变。

我还有一个通过调用每个对象上的函数生成的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)];});

2 个答案:

答案 0 :(得分:3)

  1. 制作一个包含A&amp; A的对矢量乙

    vector<pair<pointerToObjType, int>> order(N);
    for (int i=0; i<N; ++i){
        order[i] = make_pair(A[i], B[i]);
    }
    
  2. 创建自定义比较器以对配对向量进行排序。

    struct ordering {
        bool operator ()(pair<pointerToObjType, int> const& a, 
                         pair<pointerToObjType, int> const& b) {
            return a.second < b.second;
        }
    };
    
  3. 对配对矢量进行排序。

    sort(order.begin(), order.end(), ordering());
    
  4. 可以使用order[i].first

  5. 访问所有已排序的A.

答案 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是全局变量,或scorescompare打包在同一个类中。

也许更好的方法是使用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构造函数)。幸运的是,您可以将其编写为全局函数,而不必更改类本身。但是,这需要以某种方式直接比较对象。