【问题标题】:How to sort a vector or deque KeyPair如何对向量或双端队列 KeyPair 进行排序
【发布时间】:2013-03-17 23:22:43
【问题描述】:

我有一个deque <pair<int, int> > r;。 我需要按第二个参数对所有参数进行排序,并返回第一个参数的deque<int>。 例如:

deque<pair<int, int> > r;
r.push_back(make_pair(1, 5));
r.push_back(make_pair(0, 8));
r.push_back(make_pair(7, 3));
r.push_back(make_pair(2, 1));

我需要这个结果

{2, 7, 1, 0}

我有一种“蛮力”所有值都为 N2 的工作方法,但它非常糟糕。 也许存在这个std:: 的东西?我希望你能帮助我。

【问题讨论】:

    标签: c++ vector int deque std-pair


    【解决方案1】:

    您只需要定义一个比较运算符来处理您的配对中的第二个项目:

    std::sort(r.begin(), r.end(), 
        [](std::pair<int, int> const &a, std::pair<int, int> const &b) {
             return a.second < b.second;
        }
    );
    

    ...或者,如果你不能使用 lambda(例如,使用太旧的编译器),你可以明确定义你的仿函数:

    template <class T>
    struct by_second { 
        bool operator()(T const &a, T const &b) { 
            return a.second < b.second;
        }
    };
    
    std::sort(r.begin(), r.end(), by_second());
    

    从那里,获取每对中的第一项并将其放入结果中:

    std::transform(r.begin(), r.end(), std::back_inserter(result),
        [](std::pair<int, int> const &p) { return p.first; });
    

    【讨论】:

      【解决方案2】:

      您可以使用std::sort 并提供您自己的比较器:

      struct myclass {
          bool operator() (std::pair<int, int> i, std::pair<int, int> j) {
              return (i.second < j.second);
         }
      } myobject;
      
      std::sort(r.begin(), r.end(), myobject);
      

      我还没有特别用deque 尝试过这个,但通常这是这样做的。不过,该链接有一个更详尽的示例:-)

      【讨论】:

        猜你喜欢
        • 2014-06-01
        • 2015-03-30
        • 2013-03-14
        • 2015-05-01
        • 2017-06-25
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 2016-11-22
        相关资源
        最近更新 更多