STL アルゴリズムに渡すカスタム述語関数/ファンクターを作成する場合、述語はその引数のアドレスを使用できますか?
質問のきっかけとなった問題は次のとおりです。vectorと、 へのいくつかのインデックスを含むvec
vectorがあります。にインデックスがリストされている要素を削除したいと思います。inds
vec
vec
inds
1 つの方法として、アドレスを取得して引数のインデックスを決定remove_if
する述語ファンクターを使用する方法があります。InInds
vec
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
、標準に準拠したコンパイラで機能しますか? それとも、述語はアドレスではなく、値のみを操作することを厳密に意図しているのでしょうか?