Код: Выделить всё
#include
#include
#include
class SequencesRange
{
public:
struct iterator
{
using iterator_category = std::forward_iterator_tag;
using value_type = std::string;
using difference_type = long;
using pointer = value_type*;
using reference = value_type const&;
iterator (size_t size, size_t nbItems) : value_(size,' '), nbItems_(nbItems)
{
next();
}
iterator() = default;
iterator(iterator const&) = default;
iterator(iterator && ) = default;
iterator& operator= (iterator const&) = default;
iterator& operator= (iterator &&) = default;
bool operator!= (const iterator& other) const { return nbItems_ != other.nbItems_; }
bool operator== (const iterator& other) const { return nbItems_ == other.nbItems_; }
iterator& operator++ () { next(); ++nbItems_; return *this; }
iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; }
reference operator* () const { return value_; }
value_type value_;
size_t nbItems_ = 0;
void next()
{
static std::array letters = {'A','C','G','T'};
for (auto& c : value_) { c = letters[rand()%letters.size()]; }
}
};
public:
iterator begin() const { return iterator(size, 0); }
iterator end () const { return iterator(size, nbItems); }
size_t nbItems = 0;
size_t size = 0;
};
int main (int argc, char** argv)
{
SequencesRange iterable {1, 10}; // one sequence of length 10
for (auto [i,nt] : iterable | std::views::join | std::views::enumerate)
{
std::cout
Странная вещь: Если я настраиваю итерабильную с последовательностями длины> = 16, у меня нет никакой ошибки. Может быть, побочный эффект от оптимизации коротких строк? /p>
Обратите внимание, что у меня нет проблем с упрощенной версией структуры итератора
demo < /p>
update: < /strong> < /p>
Если я принужу Для предоставления копий (т.е. std :: views :: присоединение | std :: views :: enumerate Хотя только ссылки могут использоваться с итерационными | std :: views :: присоединение .
Подробнее здесь: https://stackoverflow.com/questions/794 ... viewsenume