3

STL アルゴリズムに渡すカスタム述語関数/ファンクターを作成する場合、述語はその引数のアドレスを使用できますか?

質問のきっかけとなった問題は次のとおりです。vectorと、 へのいくつかのインデックスを含むvecvectorがあります。にインデックスがリストされている要素を削除したいと思います。indsvecvecinds

1 つの方法として、アドレスを取得して引数のインデックスを決定remove_ifする述語ファンクターを使用する方法があります。InIndsvec

class InInds {
  private:

  const vector<Element>& vec_;
  const vector<int>& inds_;

  public:

  InInds(const vector<Element>& vec, const vector<int>& inds) 
    : vec_(vec), inds_(inds) {}

  bool operator()(const Element& element) {
    // WARNING: uses the ADDRESS of element, not its value. May not be kosher?
    int index = &element - &vec[0];
    return std::find(inds_.begin(), inds_.end(), index) != inds_.end();
  }

}

InIndsの要素で直接呼び出された場合に機能しvecます。elementコピーのアドレスはのインデックスを決定するのに役に立たないため、要素のコピーに対して呼び出されると壊れます。

私の質問は次のとおりです。この述語はremove_if、標準に準拠したコンパイラで機能しますか? それとも、述語はアドレスではなく、値のみを操作することを厳密に意図しているのでしょうか?

4

1 に答える 1

1

remove_if は通常、削除されていない要素を範囲の先頭に移動するため、述語での remove_if の使用は間違っています。削除されていない要素をその場で削除するのではなく、別のコンテナーにコピーする必要があります。

于 2012-04-06T21:37:42.140 に答える