Есть ли в C++ стандартный циклический итератор

На основе следующего вопроса: Проверьте, является ли одна строка вращением другой строки

Я думал о создании циклического типа итератора, который берет диапазон и смог бы решить вышеупомянутую проблему как так:

std::string s1 = "abc" ;
std::string s2 = "bca" ;
std::size_t n = 2; // number of cycles
cyclic_iterator it(s2.begin(),s2.end(),n);
cyclic_iterator end;

if (std::search(it, end, s1.begin(),s1.end()) != end)
{
   std::cout << "s1 is a rotation of s2" << std::endl;
}

Мой вопрос, уже там что-то вроде этого доступное? Я проверил Повышение и STL, и ни у одного нет точной реализации.

У меня есть простое рукописное (полученный из a std::forward_iterator_tag специализированная версия std::iterator) один, но использовал бы, уже делал/тестировал реализацию.

22
задан River 18 October 2017 в 03:09
поделиться

2 ответа

Ничего подобного в стандарте нет. Циклы плохо работают с итераторами C ++, потому что последовательность, представляющая весь цикл, будет иметь first == last и, следовательно, будет пустой последовательностью.

Возможно, вы могли бы ввести какое-то состояние в итератор, логический флаг для обозначения «еще не сделано». Флаг участвует в сравнении. Установите значение true перед итерацией и false при увеличении / уменьшении.

Но может быть лучше вручную написать нужные вам алгоритмы. После того, как вам удалось представить весь цикл, представление пустой последовательности могло бы стать невозможным.

РЕДАКТИРОВАТЬ: Теперь я заметил, что вы указали количество циклов. Это большая разница.

template< class I >
class cyclic_iterator
 /* : public iterator< bidirectional, yadda yadda > */ {
    I it, beg, end;
    int cnt;
    cyclic_iterator( int c, I f, I l )
        : it( f ), beg( f ), end( l ), cnt( c ) {}
public:
    cyclic_iterator() : it(), beg(), end(), cnt() {}

    cyclic_iterator &operator++() {
        ++ it;
        if ( it == end ) {
            ++ cnt;
            it = beg;
        }
    } // etc for --, post-operations

    friend bool operator==
        ( cyclic_iterator const &lhs, cyclic_iterator const &rhs )
        { return lhs.it == rhs.it && lhs.cnt == rhs.cnt; } // etc for !=

    friend pair< cyclic_iterator, cyclic_iterator > cycle_range
        ( int c, I f, I l ) {//factory function, better style outside this scope
        return make_pair( cyclic_iterator( 0, f, l ),
                          cyclic_iterator( c, f, l ) );
    }
};
11
ответ дан 29 November 2019 в 05:47
поделиться

Возможно, вы ищете Circular Buffer от Boost. Но если вы уже проверили Boost, это может быть не то, что вам нужно.

0
ответ дан 29 November 2019 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: