让我们假设我有不同的函数访问单个字符串str
(获取它的单个字符),我希望每次访问都循环遍历此字符串...我怎么能实现这个?
例如:
string str = "abc";
function1(); // returns "a"
function2(); // returns "b"
function3(); // returns "c"
function4(); // returns "a" again
function2(); // returns "b" again
...
所以基本上我有不同的函数访问这个字符串str
,我需要某种迭代器,如果到达str
的末尾,它会回到str
的第一个字符。< / p>
答案 0 :(得分:3)
如果你真的想使用迭代器而不是索引,你可以使用cyclic_iterator,如下所示:
#ifndef CYCLIC_ITERATOR_H_INC_
#define CYCLIC_ITERATOR_H_INC_
#include <iterator>
template <class FwdIt>
class cyclic_iterator_t : public std::iterator<std::input_iterator_tag, typename FwdIt::value_type> {
FwdIt begin;
FwdIt end;
FwdIt current;
public:
cyclic_iterator_t(FwdIt begin, FwdIt end) : begin(begin), end(end), current(begin) {}
cyclic_iterator_t operator++() {
if (++current == end)
current = begin;
return *this;
}
typename FwdIt::value_type operator *() const { return *current; }
};
template <class Container>
cyclic_iterator_t<typename Container::iterator> cyclic_iterator(Container &c) {
return cyclic_iterator_t<typename Container::iterator>(c.begin(), c.end());
}
#endif
这是非常小的迭代器 - 例如,它目前只支持预增量,而不是后增量(并且它是一个前向迭代器,所以你可以用迭代器做的就是增加它并取消引用它)
尽管如此,对于你想象的工作,似乎还是足够的。
答案 1 :(得分:2)
我只是使用string
模数运算符索引%
。这将为您提供所需的环绕行为。
#include <iostream>
#include <string>
int main()
{
std::string str = "abc";
for (int i = 0; i < 10; ++i)
{
std::cout << str[i % str.size()] << " ";
}
}
a b c a b c a b c a
答案 2 :(得分:0)
我不知道您需要多少次才能使用它,但在这里(您可以编辑它以满足您的需求):
#include <iostream>
#include <string>
int main()
{
std::string str = "abc";
bool bAgain = true;
int Max = str.length() + 1;
for(int i = 0; i < Max; i++)
{
std::cout << str[i] << "\n";
if(bAgain)
{
if(i == Max - 1)
{
i = -1;
bAgain = false;
continue;
}
}
}
}
`
a
b
c
a
b
c