Когато пишете персонализирана предикатна функция/функтор за предаване към STL алгоритъм, позволено ли е на предиката да използва адреса на своя аргумент?
Ето проблема, който вдъхнови въпроса. Имам вектор vec
и вектор inds
, който съдържа някои индекси в vec
. Бих искал да премахна онези елементи в vec
, чиито индекси са изброени в inds
.
Един подход е да се използва 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
за всеки съвместим със стандартите компилатор? Или предикатите са строго предназначени да работят само със стойности, а не с адреси?