在C ++中有一个标准的循环迭代器 [英] Is there a standard Cyclic Iterator in C++

查看:150
本文介绍了在C ++中有一个标准的循环迭代器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于以下问题:检查一个字符串是否是其他字符串的旋转

我在想一个循环迭代器类型,它接受一个范围,并且能够解决上面的问题是这样的:

I was thinking of making a cyclic iterator type that takes a range, and would be able to solve the above problem like so:

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;
}

我的问题,我已经检查过Boost和STL,也没有确切的实现。

My question, Is there already something like this available? I've checked Boost and STL and neither have an exact implementation.

我有一个简单的手工写的(从std :: forward_iterator_tag的专门版本的std :: iterator派生),但宁愿使用已经/实现。

I've got a simple hand-written (derived from a std::forward_iterator_tag specialised version of std::iterator) one but would rather use an already made/tested implementation.

推荐答案

标准中没有这样的。循环不能很好地与C ++迭代器,因为代表整个循环的序列会有 first == last ,因此是空序列。

There is nothing like this in the standard. Cycles don't play well with C++ iterators because a sequence representing the entire cycle would have first == last and hence be the empty sequence.

可能你可以在迭代器中引入一些状态,一个布尔标志来表示尚未完成。旗子参与比较。在迭代之前设置 true ,在递增/递减时设置为 false

Possibly you could introduce some state into the iterator, a Boolean flag to represent "not done yet." The flag participates in comparison. Set it true before iterating and to false upon increment/decrement.

但是它可能只是更好地手动编写所需的算法。

But it might just be better to manually write the algorithms you need. Once you've managed to represent the whole cycle, representing an empty sequence might have become impossible.

编辑:现在我注意到您指定了循环次数。这有很大的区别。

Now I notice that you specified the number of cycles. That makes a big difference.

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 ) );
    }
};

这篇关于在C ++中有一个标准的循环迭代器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆