Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#1032 closed ожидается проверка (задача сдана)

WW 15

Reported by: Roman Venediktov Owned by: Дмитрий Свиридкин
Component: WW_linq Version: 1.0
Keywords: Cc:

Description

Там есть коммит к дедлайну, но, как всегда, именно в нём всё почему-то не заработало.

Исправления всего не работающего к тому времени я тоже сделал.

Там макрос вместо копирования. Я не понял, как в той ссылке нам предлагают бороться с копированием, при условии, что функции генерирующие енумераторы должны быть полями предыдущих енумераторов.

Change History (3)

comment:1 in reply to:  description Changed 4 years ago by Дмитрий Свиридкин

Replying to Roman Venediktov:

Там макрос вместо копирования. Я не понял, как в той ссылке нам предлагают бороться с копированием, при условии, что функции генерирующие енумераторы должны быть полями предыдущих енумераторов.

Посмотрите пример с практики. Все генерирующие функции можно разместить в одном классе, отдельном от итераторов.
https://github.com/Nekrolm/hse_cpp_examples/blob/master/templates/select.cpp

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)

comment:2 Changed 4 years ago by Дмитрий Свиридкин

Resolution: задача сдана
Status: assignedclosed
  • 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

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)

comment:3 in reply to:  2 Changed 4 years ago by Roman Venediktov

  • find_ = predicate_(std::move(*parent_));

не надо делать такие move. Вы можете ограбить исходный контейнер.

А разве то, что там const остаётся не спасает? Он же становится const T&& и из него ничего не украдёшь.

Note: See TracTickets for help on using tickets.