次のようなシナリオがあります。
#include <algorithm>
using namespace std;
// a "heavy" struct with lots of members
struct B {
int key;
// other members
}
class A {
vector<B> bs;
}
bsをキーでソートしたい。さて、B の交換を避けるために過去にこれを行った方法は (かなり重いため)、インデックスのベクトルを定義し、代わりにインデックスをソートすることです。これは、bs がクラス メンバーでない場合に機能します。
例えば
vector<B> bs;
vector<size_t> indices;
bool pred(size_t i, size_t j) { return bs[i] < bs[j]; }
indices.resize(bs.size());
for (size_t i = 0; i < bs.size(); i++) indices[i] = i;
std::sort(indices.begin(), indices.end(), pred);
ただし、bs がクラス メンバーの場合、述語は 2 つのパラメーターしかとれないため、この「手法」は失敗します。特に、「これ」を渡す方法はありません。
この問題を解決するには、次の 3 つの方法があります。
- インデックスを気にしないでください。Bのインスタンスを処理するために演算子をオーバーロードするだけ
<
です。このインデックス全体は時期尚早の最適化です:-) - へのグローバル ポインタを
bs
用意し、 を呼び出す前に設定しsort
、 で使用しpred
ます。 - クロージャーを使用します。私が C++11 を使用していないことを除けば、これはかなりクールです。
これを行う他の方法はありますか?ありがとう!