Проблема с пользовательским диапазоном при использовании обоих std :: views :: join и std :: visuals :: enumerateC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с пользовательским диапазоном при использовании обоих std :: views :: join и std :: visuals :: enumerate

Сообщение Anonymous »

У меня есть простой класс последовательностей , который может идентифицировать случайные геномные последовательности фиксированного размера. : Присоединяйтесь к , он работает хорошо, но как только я пытаюсь трудиться с помощью std :: views :: enumerate , я получаю выход для мусора. Я могу проверить, что Valgrind не очень доволен и создает какой-то страшный условный прыжок или перемещение, зависит от неонициализированного значения (ы)

Код: Выделить всё

#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>
Обратите внимание, что у меня нет проблем с упрощенной версией структуры итератора 
с использованием целочисленного Sentinel для End экземпляр:
demo < /p>

update: < /strong> < /p>
Если я принужу Для предоставления копий (т.е. std :: views :: присоединение | std :: views :: enumerate Хотя только ссылки могут использоваться с итерационными | std :: views :: присоединение .

Подробнее здесь: https://stackoverflow.com/questions/794 ... viewsenume
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»