#1032 closed ожидается проверка (задача сдана)
WW 15
Reported by: | Roman Venediktov | Owned by: | Дмитрий Свиридкин |
---|---|---|---|
Component: | WW_linq | Version: | 1.0 |
Keywords: | Cc: |
Description
Там есть коммит к дедлайну, но, как всегда, именно в нём всё почему-то не заработало.
Исправления всего не работающего к тому времени я тоже сделал.
Там макрос вместо копирования. Я не понял, как в той ссылке нам предлагают бороться с копированием, при условии, что функции генерирующие енумераторы должны быть полями предыдущих енумераторов.
Change History (3)
comment:2 follow-up: 3 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
- find_ = predicate_(std::move(*parent_));
не надо делать такие move. Вы можете ограбить исходный контейнер.
-
if constexpr (std::is_same_v<typename std::iterator_traits<BeginIter>::iterator_category, std::random_access_iterator_tag>) { if (lazy_advance > 0) { if (std::distance(begin_, end_) > lazy_advance) { std::advance(begin_, lazy_advance); } else begin_ = end_; } } else { for (int i = 0; i < lazy_advance; ++i) { ++begin_; } }
В первом случае вы не вылезете за границы, ок. Но во втором случае -- вылезете. Зачем тогда все это было?
В попытках сделать полное хорошо, оптимизируя разные случаи, у вас получилось UB на некоторых краевых случаях. Не надо так.
6 + 2.5
comment:3 Changed 4 years ago by
- find_ = predicate_(std::move(*parent_));
не надо делать такие move. Вы можете ограбить исходный контейнер.
А разве то, что там const остаётся не спасает? Он же становится const T&& и из него ничего не украдёшь.
Replying to Roman Venediktov:
Посмотрите пример с практики. Все генерирующие функции можно разместить в одном классе, отдельном от итераторов.
https://github.com/Nekrolm/hse_cpp_examples/blob/master/templates/select.cpp