требованию? https://timsong-cpp.github.io/cppwp/n4861/iterator.requirements#forward.iterators-6
Но объекты *a и *b равны.
Можно ли как то написать forward iterator для последовательности без хранения самой последовательности в памяти.
Генератор? Тогда он будет input_iterator_tag , а не форвард итератор. Пример - https://devtut.github.io/cpp/iterators.html#write-your-own-generator-backed-iterator
Полухин недавно чекал что нового будет в STD=26. https://habr.com/ru/companies/yandex/articles/753260/
Так я знаю как писать простые итераторы, я хочу написать forward+ итератор для последовательности, которая не хранится в памяти. Для простоты пусть это последовательность целых чисел. Я хочу хранить только текущее число. Т.е. при * возвращать текущее число. А при ++ инкрементировать на 1. Например, хочу сгенерировать последовательность от 0 до 2^1024 для этого понадобится всего 1 число в моем случае, а не весь контейнер из 2^1024 чисел. P.S. в стать не правда Input Iterators : Can be dereferenced only once per position. Can only advance, and only one position at a time. Инпут итератор можно разыменовать сколько угодно раз.
class NonThreadSafeObject { private: mutable std::mutex fMtx{}; SomeInnerDataForManipulations fData{}; public: std::vector<Object> get() const { auto lock = std::lock_guard{fMtx}; ... } Object get(id) const { auto lock = std::lock_guard{fMtx}; ... } void create(Object) { auto lock = std::lock_guard{fMtx}; ... } // etc... }; Да никак не решить элегантно этот вопрос сейчас. Синхронизировать доступ руками - ошибкоопасно и нагружает логикой метод класса. С python-like декоратором этот класс выглядел би более изящнее
https://vk.com/wall-128170344_6349 Галовиц Я. Глава 3 итераторы как раз прям то, что тебе надо (итератор-генератор)
Да, действительно тут есть то что мне нужно, но оно реализовано с нарушением стандарта кмк)
А в чем проблема?
https://github.com/microsoft/STL/blob/6c69a73911b33892919ec628c0ea5bbf0caf8a6a/stl/inc/ranges#L1086-L1302
? Это инпут итератор же
А вам какой надо?
forward+
Ну почитайте концепт forward iterator и подстройтесь под него
Прочитал и никак не сделать)
Ну, все что вам надо: decltype(*i) -> /* can reference(not void) */ weakly_incrementable: std::move_constructible<I> std::is_same_v<decltype(++i), I&> i++ T::difference_type indirectly_readable: T::value_type T::reference T::const_reference std::is_same_v<decltype(*i), T::value_type> std::is_rvalue_reference<decltype(*i)> || std::move_constructible<I> T::value_type& convertible to T::reference T::iterator_category || T::iterator_concept std::is_base_of<std::input_iterator_tag, I> std::is_base_of<std::forward_iterator_tag, I> std::is_default_constructible<I> std::is_move_constructible<I> std::is_copy_constructible<I> std::is_copy_assignable<I> static_cast<bool>(i == i) static_cast<bool>(i != i) std::is_same_v<decltype(i++), I>
А это? https://timsong-cpp.github.io/cppwp/n4861/iterator.requirements#forward.iterators-6
и это тоже, да забыл
Как это сделать без сохранения все последовательности в памяти?
Это C++17 требования, насколько я понимаю
А ты дополнительно просто проверяй, из одной ли ячейки памяти числа, ты же можешь хранить в куче свой счетчик. Если будут два итератора с одинаковым счетчиком, но тем не менее, они будут хранить в разных ячейках, то равенства не будет (ели ты сделаешь такую проверку и вернешь false)
Обсуждают сегодня