1

オブジェクトのベクトルがあり、属性が特定の値を持つ要素の範囲を返したいです。これは構造です:

class A {
public:
  std::vector<B*> vec_;
  pair<vector<B*>::iterator, vector<B*>::iterator> getElements(unsigned int attr_val);
  unsigned int name() { return name_; }
private:
  unsigned int name_;
};

class B {
public:
  unsigned int attr() { return attr_; }
  A* source() { return source_; }
  B* dest() { return dest_; }
private:
  A* source_;
  B* dest_;
  unsigned int attr_;
};

ベクトルvec_はすでにattr_andでdest_->name()(この順序で)ソートされています。attr_ここで、に等しいすべての要素を返しますattr_val

実装するのに適切なstlアルゴリズムは何ですか(またはベクトルメンバー関数さえありますか?)getElements(unsigned int attr_val)

4

2 に答える 2

2

に渡す値が必要であり、equal_range使用する明白なものはポインターです。Bこれを取得する明白な方法は、 の正しい値で のインスタンスを作成し、attr_の値のみを含むコンパレータを作成することですattr()。ベクトルをソートすることができたので、その方法をすでに知っていると仮定します;-)

ベクトルに null ポインターがない場合は、代わりにこれを行うことができます。

struct FindAttr {
    unsigned int attr;
    FindAttr(unsigned int attr) : attr(attr) {}
    bool operator()(B *left, B *right) {
        unsigned int leftval = left ? left->attr() : attr;
        unsigned int rightval = right ? right->attr() : attr;
        return leftval < rightval;
    }
};

...

return equal_range(vec_.begin(), vec_.end(), nullptr, FindAttr(value));

それをラムダにすることができます:

return equal_range(vec_.begin(), vec_.end(), nullptr, [=value](B *left, B *right) {
    unsigned int leftval = left ? left->attr() : attr;
    unsigned int rightval = right ? right->attr() : attr;
    return leftval < rightval;
});

実際にポインターを完全に切り取って、「最もクリーンな」ソリューションだと思うものを提供できます。

struct FindAttr {
    bool operator()(B *left, unsigned int rightval) {
        return left->attr() < rightval;
    }
    bool operator()(unsigned int leftval, B *right) {
        return leftval < right->attr();
    }
};

...

return equal_range(vec_.begin(), vec_.end(), value, FindAttr());

知る限り、ラムダには呼び出しシグネチャが 1 つしかないため、これに直接相当するラムダはありません。a (またはと の両方からboost::variant暗黙的に変換され、どちらであったかを記憶する任意の型)を取るラムダを記述できると思います。unsigned intB*

于 2012-12-13T11:26:24.120 に答える
0

std::equal_range基本的に必要なことを行う を探しています。インターフェイスは次のとおりです。

pair<It, It> equal_range(It first,
                         It last,
                         const T& value,
                         Compare comp);

compデフォルトstd::lessは で、次に operator を呼び出します<

あなたの場合、実装は次のようになります。

bool comparer(B* el, unsigned int value)
{
  return el->attr() < value;
}

pair<vector<B*>::iterator, vector<B*>::iterator> A::getElements(unsigned int attr_val)
{
  return equal_range(vec_.begin(), vec_end(), attr_val, comparer);
}
于 2012-12-13T11:14:29.573 に答える