【问题标题】:Sort one array based on values of another array? [duplicate]根据另一个数组的值对一个数组进行排序? [复制]
【发布时间】:2014-10-26 04:28:01
【问题描述】:

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

我还有一个整数向量,它是通过在每个对象上调用一个函数生成的。所以我有

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)];});

【问题讨论】:

  • 你不是偶然做基因编程的吧?

标签: c++ arrays sorting


【解决方案1】:
  1. 创建一个包含 A 和 B 的对向量。

    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访问所有排序的A。

【讨论】:

    【解决方案2】:

    一种选择是将您的“分数”数组存储在std::map&lt;MyObject, int&gt; 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&lt;()(或传递给std::map 构造函数的比较器) .幸运的是,您可以将其编写为全局函数,而不必更改类本身。但是,这需要以某种方式直接比较对象。

    【讨论】:

    • 这似乎是一个很好的干净答案,我在看到它之前就已经了解了 herohuyongtao 的方法。谢谢
    • @asutherland 我原来的 lambda 实现有一个错误。我还决定恢复我的原始答案,然后用 lambda 显示简化版本。
    • 我的 zip 迭代器王国。
    猜你喜欢
    • 2022-12-18
    • 2015-04-17
    • 2015-08-05
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多