1

私は持っていdeque <pair<int, int> > r;ます。deque<int>すべてを 2 番目のパラメーターで並べ替え、最初のすべてのパラメーターを返す必要があります。例えば:

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}

私は、すべての値を N 2に「ブルート フォース」する作業方法を持っていますが、それは非常に悪い方法です。多分これは何かありますstd::か?あなたが私を助けてくれることを願っています。

4

2 に答える 2

1

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が、これは一般的にこれがどのように行われるかです。ただし、リンクにはより完全な例があります:-)

于 2013-03-27T18:33:36.297 に答える
1

ペアの 2 番目の項目を処理する比較演算子を定義するだけです。

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

...または、ラムダを使用できない場合 (たとえば、古すぎるコンパイラを使用している場合)、代わりにファンクターを明示的に定義できます。

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; });
于 2013-03-27T18:33:43.387 に答える