Уже прямо боюсь что-то говорить Поэтому просто спрошу — а разве не рекомендуется делать функторы stateless, т. к. в алгоритмах они могут копироватьсся? Этот пример работет, т. к. функтор, с которого была снята копия больше не используется — такое поведение где-то (в Стандарте) оговаривается?
ЗЫ. Если i сделать статическим членом, тоже, ИМХО, не поможет — нет гарантии, что функтор не будет применен к какому-то объекту дважды.
Здравствуйте, srggal, Вы писали:
S>Здравствуйте, saddva, Вы писали:
S>Мои 5копеек:
На эти 5 копеек есть цитата.
Stateful predicates may seem useful, but they are explicitly not very useful with the C++ standard library and its algorithms, and that is intentional. In particular, stateful predicates can only be useful if:
The predicate is not copied: The standard algorithms make no such guarantee, and in fact assume that predicates are safely copyable.
The predicate is applied in a documented deterministic order: The standard algorithms generally make no guarantee about the order in which the predicate will be applied to the elements in the range. In the absence of guarantees about the order in which objects will be visited, operations like "flag the third element" (see Examples) make little sense, because which element will be visited "third" is not well-defined.
(с) C++ Coding Standards: 101 Rules, Guidelines, and Best Practices
By Herb Sutter, Andrei Alexandrescu
Этот код непереносим. В некоторых версиях STL он работать не будет. И есть подозрение, что во многих версиях.
Здравствуйте, HiSH, Вы писали:
HSH>Уже прямо боюсь что-то говорить Поэтому просто спрошу — а разве не рекомендуется делать функторы stateless, т. к. в алгоритмах они могут копироватьсся? Этот пример работет, т. к. функтор, с которого была снята копия больше не используется — такое поведение где-то (в Стандарте) оговаривается? HSH>ЗЫ. Если i сделать статическим членом, тоже, ИМХО, не поможет — нет гарантии, что функтор не будет применен к какому-то объекту дважды.
Совсем забыл — или использовать передачу функтора по ссылке:
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, srggal, Вы писали:
E>Ага, и сделать его еще чуть-чуть универсальней :
Это не универсальность, вот если сделать так:
S>>
Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, srggal, Вы писали:
S>>Здравствуйте, saddva, Вы писали:
S>>Мои 5копеек:
_DA>На эти 5 копеек есть цитата.
Ок, если не затруднит, возникла пара вопросов.
_DA>[q]Stateful predicates may seem useful, but they are explicitly not very useful with the C++ standard library and its algorithms, and that is intentional. In particular, stateful predicates can only be useful if:
_DA>The predicate is not copied: The standard algorithms make no such guarantee, and in fact assume that predicates are safely copyable.
Чем в конкретном случае копирование может помещать ?
_DA>The predicate is applied in a documented deterministic order: The standard algorithms generally make no guarantee about the order in which the predicate will be applied to the elements in the range. In the absence of guarantees about the order in which objects will be visited, operations like "flag the third element" (see Examples) make little sense, because which element will be visited "third" is not well-defined.
Задумался, вроде как в нашем конкретном случае должно все работать в порядке обхода итераторов, но в стандарте пока ничего не нашел.
Честно гря, как-то даже не задумывался, что последовательность применения предиката может оттличаться от последовательности итерирования.
Буду искать, если есть куда в стандарте, то ткните пальцем плз.
_DA>Этот код непереносим. В некоторых версиях STL он работать не будет. И есть подозрение, что во многих версиях.
У меня как раз обратное подозрение, что на многих = он будет работать.
S>Задумался, вроде как в нашем конкретном случае должно все работать в порядке обхода итераторов, но в стандарте пока ничего не нашел. S>Честно гря, как-то даже не задумывался, что последовательность применения предиката может оттличаться от последовательности итерирования.
S>Буду искать, если есть куда в стандарте, то ткните пальцем плз.
Пока вот нашел следующее:
25.2.7/4 Notes: Stable: the relative order of the elements that are not removed is the same as their relative order in
the original range.
Т.е. раз Stable то вроде как это косвенно указывает но порядок применения предиката.
Здравствуйте, srggal, Вы писали:
_DA>>На эти 5 копеек есть цитата. S>Ок, если не затруднит, возникла пара вопросов.
_DA>>[q]Stateful predicates may seem useful, but they are explicitly not very useful with the C++ standard library and its algorithms, and that is intentional. In particular, stateful predicates can only be useful if:
_DA>>The predicate is not copied: The standard algorithms make no such guarantee, and in fact assume that predicates are safely copyable. S>Чем в конкретном случае копирование может помещать ?
Смысл этого замечания в следующем. Посмотрим на одну из популярных реализаций remove_if
Чудесный код, неправда ли? Так вот, тут экземпляр предиката _P передается в два разных алгоритма. У Саттера с Александреску пример с нахождением третьего элемента. В их случае получится, что этот третий элемент будет найден и в find_if и в remove_copy_if (на самом деле это будет уже шестой элемент). В нашем же случае да, ничего страшного с этой реализацией. Но могло бы быть и по-другому?
_DA>>The predicate is applied in a documented deterministic order: The standard algorithms generally make no guarantee about the order in which the predicate will be applied to the elements in the range. In the absence of guarantees about the order in which objects will be visited, operations like "flag the third element" (see Examples) make little sense, because which element will be visited "third" is not well-defined. S>Задумался, вроде как в нашем конкретном случае должно все работать в порядке обхода итераторов, но в стандарте пока ничего не нашел. S>Честно гря, как-то даже не задумывался, что последовательность применения предиката может оттличаться от последовательности итерирования.
S>Буду искать, если есть куда в стандарте, то ткните пальцем плз.
Ну так в том то и дело, что нет никаких гарантий порядка обхода в стандарте.
_DA>>Этот код непереносим. В некоторых версиях STL он работать не будет. И есть подозрение, что во многих версиях. S>У меня как раз обратное подозрение, что на многих = он будет работать.
Здравствуйте, HiSH, Вы писали:
HSH>Здравствуйте, HiSH, Вы писали:
HSH>>Уже прямо боюсь что-то говорить Поэтому просто спрошу — а разве не рекомендуется делать функторы stateless, т. к. в алгоритмах они могут копироватьсся? Этот пример работет, т. к. функтор, с которого была снята копия больше не используется — такое поведение где-то (в Стандарте) оговаривается? HSH>>ЗЫ. Если i сделать статическим членом, тоже, ИМХО, не поможет — нет гарантии, что функтор не будет применен к какому-то объекту дважды.
HSH>Совсем забыл — или использовать передачу функтора по ссылке: HSH>
Здравствуйте, remark, Вы писали:
К>>Для того, чтобы сделать его переносимым — достаточно вынести состояние за пределы экземпляра функтора.
R>А как быть с порядком применения функтора к элементам последовательности?
Для некоторых алгоритмов порядок определён.
Хотя в данном случае, проще написать цикл, чем крутиться с собственными функторами или итераторами.
int n=v.size();
int w=0; // w - writefor(int r=0; r!=n; ++r) // r - read
{
if(r%3!=0)
if(w!=r) v[w++] = v[r];
}
v.resize(w);
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, remark, Вы писали:
К>>>Для того, чтобы сделать его переносимым — достаточно вынести состояние за пределы экземпляра функтора.
R>>А как быть с порядком применения функтора к элементам последовательности?
К>Для некоторых алгоритмов порядок определён. К>Хотя в данном случае, проще написать цикл, чем крутиться с собственными функторами или итераторами. К>