gpt4 book ai didi

c++ - C++ 中是否有标准的循环迭代器

转载 作者:IT老高 更新时间:2023-10-28 21:47:49 25 4
gpt4 key购买 nike

基于以下问题:Check if one string is a rotation of other string

我正在考虑制作一个带有范围的循环迭代器类型,并且能够像这样解决上述问题:

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,但都没有确切的实现。

我有一个简单的手写(源自 std::forward_iterator_tag 专用版本的 std::iterator),但宁愿使用已经制作的/经过测试的实现。

最佳答案

标准中没有这样的东西。循环不能很好地与 C++ 迭代器配合使用,因为表示整个循环的序列将具有 first == last,因此是空序列。

您可能可以在迭代器中引入一些状态,一个表示“尚未完成”的 bool 标志。标志参与比较。在迭代之前将其设置为 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 ) );
}
};

关于c++ - C++ 中是否有标准的循环迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2616643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com